2017-02-20 64 views
0

我有一个配置了端口3000上运行的Passport的环回API服务器。我的UI由来自端口3080的react JS组成。我想用Google实现身份验证。对于这一点,从我反应过来的应用程序,我想提出一个呼叫 localhost:3000/auth/google 但这一呼声没有得到重定向因为CORS错误的谷歌:在StrongLoop支持的ReactJS应用程序上启用CORS

Fetch API cannot load http://localhost:3000/auth/google. Redirect from 'http://localhost:3000/auth/google' to 'https://accounts.google.com/o/oauth2/auth?response_type=code&redirect_uri=h…d=584602753475-1kk345gd8trcn31pbg1v2gncajhpakk8.apps.googleusercontent.com' has been blocked by CORS policy: Request requires preflight, which is disallowed to follow cross-origin redirect.

当我打http://localhost:3000/auth/google URL从一个新的浏览器标签,一切工作正常。

任何人都可以告诉我应该在哪里启用cors?

编辑

我能看到的是,浏览器正在一个选项请求到localhost:3000/auth /中谷歌

这是我得到的时候我做了一个选项,卷曲要求: HTTP/1.1 204 No Content X-Powered-By: Express Vary: Origin Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE Access-Control-Max-Age: 86400 Date: Mon, 20 Feb 2017 14:05:53 GMT Connection: keep-alive

回答

0

我不知道如何启用Strongloop或ReactJS CORS,但来启用它,你需要两样东西:

1. The right configuration of the JS request like so: 

var params = { 
    … 
    mode: 'cors', 
    credentials: 'include' //<- that gave me some headache a while ago, 
         //but is probably not necessary in your case. 
    … 
} 

fetch(new Request(<url>, params).then(res => …); 
  1. 正确的服务器配置。 Cors请求将首先使用预检请求调用服务器,该请求会告诉浏览器是否可以访问此资源,包括所有标题。此请求使用http OPTIONS方法/动词,以便您的服务器需要正确响应。如果确实如此,浏览器将执行您想要执行的实际请求。

我希望有所帮助。

+0

感谢您的回复。我在我的JS获取请求中有这部分。浏览器向“http:// localhost:3000/auth/google”发出一个选项请求。这是事情被阻止的地方。 –

+0

您测试了选项请求吗? http://stackoverflow.com/questions/14481850/how-to-send-a-http-options-request-from-the-command-line – philipp

+0

我尝试了一个选项请求。响应是:'HTTP/1.1 204无内容 X-Powered-By:Express Vary:Origin Access-Control-Allow-Credentials:true Access-Control-Allow-Methods:GET,HEAD,PUT,PATCH,POST ,删除 访问控制最大年龄:86400 日期:2017年2月20日星期一14:05:53 GMT 连接:保持活动状态 –