尝试将客户端重定向到Google OAuth,得到405错误

问题描述:

我尝试创建一个连接到Google Calendar API的Web服务。在试图授权我的应用程序时,我已经生成了具有必要范围的网址。问题是,当我尝试将客户端重定向到生成的URL,我得到一个405错误,消息如下:尝试将客户端重定向到Google OAuth,得到405错误

回应预检要求未通过访问控制检查:没有 “访问控制-Allow-Origin'标题出现在请求的 资源中。 'http://localhost:8080'因此不允许 访问。响应的HTTP状态码为405.

对于大多数情况,我一直在遵循本指南:https://developers.google.com/identity/protocols/OAuth2WebServer使用node.js客户端库。

据我所知,似乎谷歌没有配置他们的服务器来接受跨域请求,我不明白的是我应该如何重定向我的用户到他们的授权页面,如果我无法发送请求我的域名。

下面是相关代码:

export function authorize(req, res, callback): any { 
    let auth = new googleAuth(); 
    let oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); 
    if (// Check if we have previously stored a token.) { 
    oauth2Client.credentials = //get token; 
    callback(oauth2Client); 
    } else { 
    //redirect to google authentication page 
    let authUrl = oauth2Client.generateAuthUrl({ 
     access_type: 'offline', 
     state: '/', 
     scope: SCOPES 
    }); 
    res.redirect(authUrl); 
    } 
} 
+1

405意味着“方法不允许”,因此在这种情况下意味着服务器根本不允许OPTIONS请求到您尝试访问的“authUrl”URL。我认为它可能与服务器是否接受跨域请求没有任何关系 - 但是您可以使用curl或邮递员或其他工具来确认是否向该authUrl URL发送OPTIONS请求,然后查看您的内容回来。我打赌你会得到一个405. – sideshowbarker

+0

无论如何,只要该服务器给予OPTIONS请求405,就无法从前端JavaScript代码成功访问其响应。您需要改为从后端代码发出请求。对于基于OAuth的服务来说,这似乎总是如此 - 您无法使用XHR或Fetch API从您的前端JavaScript代码可以访问的应用程序获取响应。 – sideshowbarker

+0

@sideshowbarker OPTIONS请求是来自浏览器的预检请求,而不是我有意做的事情。你是对的,我使用邮递员也遇到了同样的问题,但是对于OPTIONS请求405仍然是一个问题,因为我正在发出CORS请求,所以我必须导航。如果我请求服务器端用户如何认证?例如,如果谷歌示例中的链接要求您登录并授予对示例范围的访问权限,我仍然需要用户登录/授予我的应用程序访问权限。 –

原来当AJAX收到300个状态码,浏览器会自动发送另一个GET请求,返回的位置上代表客户。即使我已经解决了我的CORS问题,我也必须自己手动加载html页面,因为请求是代表客户端进行的。我真正想要的是浏览器向auth uri发出请求。

所以我解决这个问题的方法是检测前端的重定向,并让浏览器发出一个全新的GET请求。仍然看起来像一个工作,所以如果任何人有更好的解决方案,我想听听它。