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

时间:2017-08-10 01:05:11

标签: node.js oauth-2.0 cors google-oauth2 http-status-code-405

我正在尝试创建一个连接到Google Calendar API的Web服务。在尝试授权我的应用时,我生成了一个包含必要范围的网址。问题是当我尝试将客户端重定向到生成的URL时,我收到405错误,并显示以下消息:

  

对预检请求的响应未通过访问控制检查:否   请求中存在“Access-Control-Allow-Origin”标头   资源。因此不允许来源“http://localhost:8080”   访问。响应的HTTP状态代码为405。

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

根据我的理解,Google似乎没有将他们的服务器配置为接受跨源请求,我不明白如果我无法向我的用户发送请求,我应该如何将用户重定向到他们的授权页面域。

以下是相关代码:

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);
  }
}

2 个答案:

答案 0 :(得分:0)

如果有人使用React或类似的SPA框架解决与OAuth 2相关的问题,请阅读以下内容:

请勿在服务器端重定向。不要这样做(node.js / express作为后端示例):

router.get('/go', errorHandler(async (req, res, next) => {
    res.redirect(authenticationUrl);
})
);

这样做:

router.get('/go', errorHandler(async (req, res, next) => {
    res.json({
        redirectUrl: 'https://google.com'
    })
})
);

然后在您的前端客户端上,获取响应并进行重定向。示例:

getUrl = async () => {
    try {
        const res = await API.get(`/go`);
        window.location = res.data.redirectUrl;
    } catch (err) {
        console.log(err);
    }
}

在React中工作。已检查!

答案 1 :(得分:0)

根据流程,它显示为浏览器(APP)-> API(服务器)-> Google auth(重定向),这是身份提供商服务器(如 AWS、Google Auth 等)非常常见的路径。如他们从不发送额外的 ALLOW ORIGIN 标头,这就是浏览器在重定向时拒绝请求的原因

现在是锻炼解决方案。

  1. 应用域 (http://localhost:3000) 应添加为 IDP 服务器上的受信任域

  2. 向 API 服务器发起 Auth 请求的请求应为

    window.location.href = 'http://localhost:5000/api/v1/auth/login-google';