我使用stormpath使用带有节点/快速服务器的角度webapp登录。除了Safari之外,这一切都适用于大多数现代浏览器。它似乎是访问令牌cookie的东西。不知道这是不是一个bug。
当我登录(使用用户名和密码)时,我的POST请求进展顺利,看起来像这样:
POST /login HTTP/1.1
Host: ****api.herokuapp.com
Content-Type: application/x-www-form-urlencoded
Origin: http://app.****.com
Content-Length: 30
Connection: keep-alive
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7
Referer: http://app.****.com/
Accept-Language: en-us
Accept-Encoding: gzip, deflate
username=***&password=********
一切顺利,并回复此回复:
HTTP/1.1 200 OK
Server: Cowboy
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: http://app.****.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS
Access-Control-Allow-Headers: X-Requested-With, Content-Type
Access-Control-Allow-Credentials: true
Set-Cookie: access_token=eyJraWQiOiIySUxB****unsEg; path=/; expires=Wed, 06 Jan 2016 16:01:38 GMT; httponly
Set-Cookie: refresh_token=eyJraWQiOiIySUxBNV&****LlwrlEtNhzI; path=/; expires=Sun, 06 Mar 2016 15:01:38 GMT; httponly
Date: Wed, 06 Jan 2016 15:01:38 GMT
Transfer-Encoding: chunked
Via: 1.1 vegur
在登录请求之后,我在加载路由之前请求userprofile数据。但是,此请求将返回HTTP 401:
GET /me HTTP/1.1
Host: ****api.herokuapp.com
Origin: http://app.****.com
Connection: keep-alive
If-None-Match: W/"8c4-kH0dxMVw01EmGs/YFtZjXg"
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7
Accept-Language: en-us
Referer: http://app.****.com/
Accept-Encoding: gzip, deflate
在另一个浏览器(firefox)中,使用/ me请求发送access_token cookie。我不知道为什么safari不会随请求发送cookie。结果,该请求是未经授权的(401)。有人知道如何解决这个问题,或者它是Stormpath中的错误
答案 0 :(得分:2)
这可能是由跨域问题引起的。如果您的Angular应用程序是从与API服务不同的域提供的,则会遇到此问题。 Safari不允许在跨域请求上设置cookie。