【问题标题】:Spring Oauth2 CORS issue春季 Oauth2 CORS 问题
【发布时间】:2016-06-29 08:20:54
【问题描述】:

我将 CORS 设置为允许很少的自定义标头。以下是响应标头 -

响应标头 { "Date": "2016 年 3 月 14 日星期一 10:11:59 GMT",
“服务器”:“Apache-Coyote/1.1”,“传输编码”:“分块”,
“访问控制最大年龄”:“3600”,“访问控制允许方法”: “POST、GET、OPTIONS、DELETE、PUT”、“Content-Type”: “应用程序/json”、“访问控制允许来源”: "*",
"访问控制允许凭据": "true",
"Access-Control-Allow-Headers": "X-Requested-With, Authorization, Content-Type、Authorization_Code、User_Credentials、 Client_Credentials" }

上面的响应头应该意味着API可以从具有以下头的所有来源使用:Authorization, Content-Type, Authorization_Code, User_Credentials, Client_Credentials

我可以传递所有标头并使用来自所有来源的 API。

问题 -

不允许使用授权 API 的请求。授权是像这样传递 Oauth 令牌的标头 - Authorizatio = Bearer ct45tg4g3rf3rfr5freg34gerfgr3gf(不记名令牌)。

corsclient.js:609 选项http://54.200.113.97:8080/supafit-api/users sendRequest@corsclient.js:609(匿名函数)@ corsclient.js:647b.event.dispatch @ jquery-1.9.1.min.js:3v.handle @ jquery-1.9.1.min.js:3 /client#?client_method=GET&client_credentials=false&client_headers=Authoriz…nable=true&server_status=200&server_credentials=false&server_tabs=remote:1 XMLHttpRequest 无法加载 http://54.200.113.97:8080/supafit-api/users。对预检的响应 请求未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。原点 'http://client.cors-api.appspot.com' 因此不是 允许访问。响应的 HTTP 状态代码为 401。

编辑:

这是该 API 的 Rest Client 测试 -

响应标头 -

Server: Apache-Coyote/1.1 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: 0
X-XSS-Protection: 1; mode=block 
X-Frame-Options: DENY
X-Content-Type-Options: nosniff 
Access-Control-Allow-Origin: http://client.cors-api.appspot.com 
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT 
Access-Control-Max-Age: 3600
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Headers: X-Requested-With 
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Headers: Authorization_Code
Access-Control-Allow-Headers: User_Credentials
Access-Control-Allow-Headers: Client_Credentials 
Content-Type: application/json 
Transfer-Encoding: chunked 
Date: Mon, 14 Mar 2016 11:19:42 GMT Raw JSON

JSON 响应正文 -

{ "id":78, "userId":"3465434567", "coachId":null,
“名称”:“XDCDSC”,“dob”:null,“电子邮件”:“puneetpandey37@gmail.com”, "imageURL":"https://lh5.googleusercontent.com/-TcTQeitAvag/AAAAAAAAAAI/AAA/4pamurzO1a4/photo.jpg", “性别”:null,“userPhysic”:null,“userTypeId”:1,
"dietitanId":null, "alternateEmailId":null,
"yearsOfExperience":null, "lastExperience":null,
"languagesKnown":null, "aboutYourself":null,
"coreCompetence":null, "fieldOfWork":null, "userAddresses":[
{
“身份证”:1, “用户ID”:78, “位置标识”:1, “地址”:“EC”, "landmark":"靠近 BN", “电话号码”:空, “地址类型”:“家” } ], "电话号码":[

] }

【问题讨论】:

  • 我使用这个站点 - www.test-cors.org/ 来测试 CORS 请求并且没有响应。它只告诉 CORS 是不允许的。当我从 Rest Client 测试 API 时,我得到“授权”作为允许的标头,但仍然存在 CORS 问题。请参阅上面我的问题的第 2 段以找到响应 Heder。谢谢!

标签: java spring-mvc oauth-2.0 cors spring-security-oauth2


【解决方案1】:

响应的 HTTP 状态代码为 401。

您的服务器需要对 Preflight Request 进行身份验证,但客户端会删除凭据,因为 CORS specification 说:

否则,请提出预检请求。从 origin 源源获取请求 URL,使用引用源作为 覆盖引用源,并设置 手动重定向标志block cookies 标志,使用方法OPTIONS,并具有以下附加约束:

包含一个Access-Control-Request-Method 标头作为标头字段值请求方法(即使这是一个简单的方法)。

如果作者请求标头不为空,则包含 Access-Control-Request-Headers 标头,标头字段值是按字典顺序从作者请求标头中以逗号分隔的标头字段名称列表,每个都转换为 ASCII 小写字母(即使一个或多个是一个简单的标题)。

  • 排除作者请求标头。

  • 排除用户凭据。

  • 排除请求实体正文。

您必须更改您的服务器,以允许匿名访问 Preflight Request。

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 2017-01-04
    • 2018-08-12
    • 2018-08-01
    • 2017-06-24
    • 2016-09-07
    • 2011-10-19
    • 2018-09-11
    • 2015-04-17
    相关资源
    最近更新 更多