【问题标题】:Google API, Node.js - redirect_uri_mismatch after getTokenGoogle API,Node.js - getToken 后的 redirect_uri_mismatch
【发布时间】:2019-08-18 07:20:48
【问题描述】:

我的后端应用程序上有一个路由,它应该为从前端发送的代码返回一个 access token

router.get('/token', (req, res) => {
  const auth = googleService.getAuth();

  auth.getToken(req.query.code, (error, res2) => {
    const data = { code: 200 }

    if (error) {
      data.code = error.code;
      data.error = error.response.data;
    } else {
      console.log(res2);
    }

    res
      .status(data.code)
      .send(data);
  })
});

我从 googleService.getAuth() 中检索 auth

const { google } = require('googleapis');
const keys = require('../config/keys');

var module = module.exports = {
  getAuth: (token = false) => {
    let auth = new google.auth.OAuth2(
      keys.google.clientID,
      keys.google.clientSecret,
      keys.google.callbackURL
    );

    if (token) {
      auth.credentials = {
        access_token: token,
        refresh_token: null
      };
    }

    return auth;
  },
  youtube: google.youtube('v3')
};

在我的配置文件中,我有 callbackURL:

module.exports = {
  google: {
    apiKey: 'XXXXXXXXXXXXXXXX',
    clientID: 'XXXXXXXXXXXXXX',
    clientSecret: 'XXXXXXXXXXXXXXX',
    callbackURL: 'http://localhost:3000/google/redirect'
  }
}

我也在控制台中设置了它:

但是,我在调用这个路由的时候总是出现以下错误:

"error": {
  "error": "redirect_uri_mismatch",
  "error_description": "Bad Request"
}

【问题讨论】:

    标签: node.js google-api google-api-nodejs-client


    【解决方案1】:

    uri 需要从 auth 到 token 匹配。所以看起来你通过token 端点进行身份验证并尝试将令牌发送到google/redirect 路径。你可以解决这个问题。

    为此,请验证重定向 uri 是否已在您的 google 项目控制台中列入白名单。您可以通过 API 访问查看此内容(您可以在其中看到客户端 ID、客户端密码以及重定向 uri 列表)

    【讨论】:

    • 我不确定是否真的明白。我在“Authorized Javascript Origins”中添加了http://localhost:3000,它并没有改变任何东西Screenshot
    • 您通过 http:localhost:3000/token 向 google 请求令牌,并且您正试图将该令牌发送到 http:localhost:3000/google/redirect,这会导致 uri 不匹配错误。您应该能够将要发送令牌的 uri 添加到项目控制台中的列表中。
    • 我还是不明白。我不是从后端登录,而是从前端登录,在那里我得到了一个发送到后端的代码。无需重定向到任何路由,但是 API 要求我这样做。 I also inspired myself from this我该怎么办?
    • 正确,因此您登录 FE 并要求您的 BE 处理向 google 请求令牌。你给谷歌你的信用(clientId + secret)以换取令牌。问题是您要求令牌的位置与令牌应该去的位置不同。然后 uri 中的差异会引发您得到的错误。为了克服这个问题,你需要告诉谷歌,'嘿,google/redirect 和我在一起,他很酷'。 Google 只是将 http://localhost:3000/tokenhttp://localhost:3000/google/redirect 进行比较。显然这些是相同的,因此错误。
    • 我终于明白了!但我没有使用你提到的任何东西哈哈。在我的代码中,我将callbackURL 更改为https://localhost:4200,这是托管我的前端的地址,在控制台上,我将https://localhost:4200 添加到“Web 应用程序的客户端ID”页面中的授权重定向URI 中。尽管这是一个非常奇怪的配置,但现在一切正常!
    【解决方案2】:

    您可能没有本地的重定向 URI。

    如果是这样,您可以在 2 分钟内使用https://ngrok.com 为您的 localhost 提供一个 http 有效地址

    希望对你有帮助

    【讨论】:

    • 这个其实可以的,我之前做过多次测试。感谢您的贡献
    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2014-12-05
    • 2014-12-04
    • 2020-11-08
    • 2014-08-29
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多