登录$.ajax()到站点后,我尝试$.ajax()向该站点发送第二个请求 - 但是当我检查使用FireBug发送的标头时,请求中不包含会话cookie.
我究竟做错了什么?
我在两个不同的域中有两个webapps WebApp1和WebApp2.
我知道这听起来很奇怪,因为cookie特定于某个域,我们无法从不同的域访问它们; 我听说过CROSS-DOMAIN cookie可以在多个webapps之间共享.如何使用CROSS-DOMAIN cookie实现此要求?
注意:我正在尝试使用J2EE webapps
运行的javascript应用程序10.0.0.1尝试使用跨域ajax调用对其用户进行身份验证.
请求如下:
function test(again){
$.ajax({
type: 'GET',
url: 'http://example.com/userinfo',
dataType: 'json',
success: function(userinfo){
if(again)
test(false);}});}
test(true);
Run Code Online (Sandbox Code Playgroud)
服务器的第一个响应尝试设置cookie:
Access-control-allow-origin:http://10.0.0.1
Set-Cookie:PHPSESSID=uuj599r4k1ohp48f1poobil665; expires=Sat, 28-Jan-2012 17:10:40 GMT; path=/
Run Code Online (Sandbox Code Playgroud)
但第二个请求不包括此cookie,也不包括对该域的任何其他ajax请求.
我不是想为另一个域读取cookie,我只是希望其他域上的应用程序能够设置和读取自己的cookie.
这可能吗?
我在Chrome和Firefox 9中测试过.
我正在使用基于会话的授权在不同的域上使用前端和后端应用程序.我已经设置了一个有效的CORS配置,它可以按预期工作localhost(例如从端口:9000到端口:8080).一旦我在安全域上部署应用程序(两个域都只允许HTTPS),在JavaScript中就不再可以访问CSRF cookie,从而导致前端的错误后续请求(缺少CSRF头).
cookie由Set-Cookie标题中的后端设置,不使用HttpOnly标志.它实际上设置在浏览器的某个位置,因为后续请求包含会话cookie和CSRF cookie.尝试通过JavaScript访问它(使用例如document.cookie在控制台中)返回一个空字符串.DevTools of Chrome不会在前端域上显示任何 cookie(后端域甚至没有列出).
我期待cookie被设置并在当前域(前端域)上可见.我正在使用axios库的withCredentials标志.
你有什么想法,为什么不能从JavaScript或Chrome中的DevTools访问cookie?这与Strict-Transport-Security标题有什么关系吗?
1.初始GET响应标头
HTTP/1.1 401 Unauthorized
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://[my-frontend-domain]
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Encoding: gzip
Content-Type: application/json;charset=UTF-8
Date: Wed, 20 Sep 2017 11:57:07 GMT
Expires: 0
Pragma: no-cache
Server: Apache-Coyote/1.1
Set-Cookie: CSRF-TOKEN=[some-token]; Path=/
Vary: Origin,Accept-Encoding
X-Content-Type-Options: nosniff
X-Vcap-Request-Id: [some-token]
X-Xss-Protection: 1; mode=block
Content-Length: [some-length]
Strict-Transport-Security: max-age=15768000; includeSubDomainsRun Code Online (Sandbox Code Playgroud)
2.后续POST请求标头
背景
我们有一个大型的Ionic v1应用程序可以在Android上运行(通过Google Play商店获取),也可以通过"离子服务"在我们的开发机器上运行.
该应用使用Google App Engine(GAE)网站作为后端服务器.服务器通过cookie为每个用户维护会话.我们不会在会话中存储太多数据,但我们需要安全地识别发出每个请求的用户.当应用程序成功运行时,GAE服务器代码会创建一个包含会话ID的cookie,并在响应每个HTTP请求时将其发送到Ionic客户端代码.
请注意,Ionic代码不以任何方式访问cookie.只需要将相同的cookie与每个后续请求一起发送回GAE服务器,以便GAE代码识别用户.
目标
我们希望使用Firebase Hosting提供Ionic代码.事实上我们可以在两种模式中这样做:
一个.将Ionic代码保存在我们的开发机器上,运行"firebase serve",然后在浏览器上转到"localhost:5000"
湾 将Ionic代码部署到Firebase主机并在浏览器上转到"xxxx.firebaseapp.com"
一切正常!呃,除了一件小事,我们几周都试图解决这个问题......
问题
所使用的GAE代码来管理会话连续性,并通过GAE代码生成的HTTP请求的响应发送的cookie的,不回来,从火力地堡上运行的应用程序离子的下一个请求.因此,GAE应用程序始终响应,就像用户尚未登录一样.
事实上,进一步的测试表明,在响应发送的HTTP请求的会话cookie甚至不会在浏览器设置(所以当然这不是发送回GAE代码与下一个HTTP请求).后端服务器上的GAE代码始终响应,就好像这是会话的第一个HTTP请求一样.
我们消除了什么
问题不在于Ionic不支持cookie.我们知道这不是问题,因为该应用程序可以作为Android应用程序和"离子服务"运行良好.在这两种情况下,GAE后端都能够使用cookie来维护会话,以将会话ID从一个请求存储到下一个请求.
使用"memcache"而不是GAE会话支持的cookie不能解决问题,因为即使你使用memcache,你仍然需要会话ID的cookie.如果您愿意,可以使用默认设置,让GAE会话支持使用cookie; 在这种情况下,它将对会话ID和任何其他会话数据使用相同的cookie.
使用"__session"作为cookie的名称无法解决问题.Firebase确实支持使用这样的cookie名称,但显然仅在运行带有云功能的Firebase托管的环境中.云功能用于运行后端代码,而不是用户与之交互的客户端代码.我们无法看到将Ionic应用程序作为云功能运行.如果没有云功能,GAE后端设置的"__session"cookie显然会被运行应用程序的浏览器客户端以及所有其他cookie剥离.
加入"访问控制允许来源/ -Credentials/-方法/ -headers"报头到GAE码生成的响应,并设置crossDomain: true
xhrFields: { withCredentials: true }在客户机侧,没有改善的情况.仍然没有在浏览器上设置GAE代码的cookie.
任何帮助将非常感谢.
cookies google-app-engine cross-browser cross-domain ionic-framework
很久的潜伏者,第一次在这里发布海报.
有关JWT的许多良好指南和资源以及如何以及在何处存储它们.但是,当涉及到在节点服务器上运行的ReactJS/Flux应用程序和完全独立的Rails API之间安全地存储和发送JWT时,我陷入了僵局.
似乎大多数指南告诉您只需将JWT存储在本地存储中,然后为每个AJAX请求将其解析出来并将其传递到标题中.https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/警告不要这样做,因为本地存储不安全,恶意的人可以访问该令牌.它建议将其存储在cookie中,只是让Web浏览器将其与每个请求一起传递.
这听起来不错,因为根据我的理解,无论如何都可以方便地将cookie与每个请求一起发送.这意味着我可以从我的ReactJS应用程序向我的Rails API发出AJAX请求,并让API将其拔出,检查它,并做到这一点.*
我遇到的问题是我的Node应用程序没有从它从Rails API返回的响应中设置cookie,即使Rails API(在localhost:3000上运行)返回Set-Cookie标头并将其发送回ReactJS/Node应用程序(在localhost:8080上运行).
这是我的Rails API方面的登录控制器操作:
class V1::SessionsController < ApplicationController
def create
user = User.where(email: params[:user][:email]).first!
if user && user.authenticate(params[:user][:password])
token = issue_new_token_for(user)
# I've tried this too.
# cookies[:access_token] = {
# :value => token,
# :expires => 3.days.from_now,
# :domain => 'https://localhost:8080'
# }
response.headers['Set-Cookie'] = "access_token=#{token}"
render json: { user: { id: user.id, email: user.email }, token: token }, status: 200
else
render json: { errors: 'username or password did …Run Code Online (Sandbox Code Playgroud)