我在SO上提到了这个问题:Google oauth 400 response: No 'Access-Control-Allow-Origin' header is present on the requested resource,但建议的解决方案是Javascript web应用使用隐式授权流。
我的设置是这样的,我的前端构建在angular 4上,但我将其打包并将其与rest API一起部署在同一台服务器上。我正在跟踪服务器端Web应用程序流程:https://developers.google.com/identity/protocols/OAuth2WebServer(在下面的示例中,服务器端口为8300)
我已经授权http://localhost:8300作为Javascript源代码,并从一个angular应用程序向驻留在http://localhost:8300/auth/oauth/test上的rest API发出请求,但我仍然收到CORS错误:
无法加载https://accounts.google.com/o/oauth2/v2/auth?client_id=568176070083-1lc20949a0q58l0rhmq93n95kvu8s5o6.apps.googleusercontent.com&redirect_uri=http://localhost:8300/auth/myauth/oauth/callback&response_type=code&scope=https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&state=EUTZF8:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源'http://localhost:8300'。
我的问题是:
1.建议的解决方案here是唯一的出路吗?
- Google API页面上是否有我错过的配置?
1.如果我直接从浏览器访问rest API http://localhost:8300/auth/oauth/test,一切都很好。但是如果我从浏览器向这个url发出get请求(因为它是安全的,重定向到google API应该发生,在认证之后,至少这个rest api断点应该被命中)。因为在这两种情况下,都是进入
我最后一个假设是错的吗?
如果这是相关的,我正在执行angular get请求,如下所示:
loginWithGoogle(){
console.log(" Login with oauth2 ");
let oauthUrl = "http://localhost:8300/auth/oauth/test";
return this.http.get(oauthUrl)
.subscribe(
res => {
this.onSuccess(res);
}, error => {
this.onFailure(error);
});
}
编辑
实际上我的第三点是为什么当从angular应用程序通过XHR访问rest API时会抛出CORS,这也是在与rest api相同的域中,而不是直接从浏览器访问rest api时。
2条答案
按热度按时间hxzsmxv21#
当您使用授权代码授予(后端应用程序的OAuth2-
&response_type=code
)时,您必须将浏览器重定向到/auth
端点-您不能为此使用XHR。用户将在身份验证后重定向回来。重定向到
/auth
端点后,用户需要在地址栏中看到该页面来自Google(可信来源),Google可能需要进行更多的重定向,以验证用户并显示同意页面。所以使用XHR是不可能的。更新:对于第三点,如果请求不包含有效凭据,则后端API应返回HTTP 401(而不是像现在这样的HTTP 30 x重定向)。然后,您的Angular应用程序需要一个HTTP错误处理程序,它会在HTTP 401响应时重定向浏览器。
但是如果你想在你的Angular应用程序中保留令牌,最好使用隐式授权,它是为在浏览器中运行的应用程序设计的。因为使用授权代码授权,你的后端有客户端的角色(在OAuth2方案中),但你希望Angular应用程序是客户端(因为它持有令牌)。
deikduxw2#
这对我来说很好。实际上,这个错误只是关于cors的,我设法在Google Cloud Console中纠正了它。其次,你也必须在你的后端API中添加cors。