服务器端Web应用程序的Google Oauth2 CORS问题

siv3szwd  于 2023-06-21  发布在  Go
关注(0)|答案(2)|浏览(142)

我在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是唯一的出路吗?

  1. 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时。

hxzsmxv2

hxzsmxv21#

当您使用授权代码授予(后端应用程序的OAuth2-&response_type=code)时,您必须将浏览器重定向到/auth端点-您不能为此使用XHR。用户将在身份验证后重定向回来。
重定向到/auth端点后,用户需要在地址栏中看到该页面来自Google(可信来源),Google可能需要进行更多的重定向,以验证用户并显示同意页面。所以使用XHR是不可能的。
更新:对于第三点,如果请求不包含有效凭据,则后端API应返回HTTP 401(而不是像现在这样的HTTP 30 x重定向)。然后,您的Angular应用程序需要一个HTTP错误处理程序,它会在HTTP 401响应时重定向浏览器。
但是如果你想在你的Angular应用程序中保留令牌,最好使用隐式授权,它是为在浏览器中运行的应用程序设计的。因为使用授权代码授权,你的后端有客户端的角色(在OAuth2方案中),但你希望Angular应用程序是客户端(因为它持有令牌)。

deikduxw

deikduxw2#

这对我来说很好。实际上,这个错误只是关于cors的,我设法在Google Cloud Console中纠正了它。其次,你也必须在你的后端API中添加cors。

相关问题