【问题标题】:Nodejs google oAuth2 invalid credentialsNodejs google oAuth2 无效凭据
【发布时间】:2016-02-23 16:33:48
【问题描述】:

我有以下一段代码,允许用户创建谷歌日历事件。最初,它将检查用户是否设置了访问令牌,如果没有,它将启动常规的 oAuth2 授权过程并在用户配置文件中获取 + 保存访问令牌和刷新令牌。随后的请求将允许用户通过其个人资料中设置的访问令牌创建日历事件。

代码如下:

function getNewToken() {
    const authUrl = oauth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: SCOPES
    });
    return authUrl;
}

module.exports = {
    insert(req, res, next) {
        User.findById(req.user._id, (err, user) => {
            if (user.accessToken) {
                oauth2Client.setCredentials({
                    refresh_token: user.refreshToken
                });
                const calendar = google.calendar('v3');
                calendar.events.quickAdd({ auth: oauth2Client, calendarId: 'primary', text: 'Test Calendar' }, (err, data) => {
                    if (err) {
                        next(err);
                    }
                    res.status(200).send('Successfully added calendar event');
                });
            } else {
                const authUrl = getNewToken();
                res.redirect(authUrl);
            }
        });
    },

    googleOauth2Callback(req, res, next) {
        const code = req.query.code;
        oauth2Client.getToken(code, (err, token) => {
            if (err) {
                next(err);
            }
            User.findByIdAndUpdate({ _id: req.user._id }, { accessToken: token.access_token, refreshToken: token.refresh_token }, (err) => {
                if (err) {
                    next(err);
                }
            });
            res.send({ token });
        });
    }
};

但是,我注意到经过一段时间后,我收到“401 Invalid Credentials”错误。我注意到,如果我省略 access_token 并在 oAuth2Client 中设置刷新令牌,那么一切都会按预期工作。

这是处理 oAuth2 令牌的正确方法吗?我可以继续在我的 API 请求中仅使用刷新令牌吗?刷新令牌过期时会发生什么?任何帮助,将不胜感激。

【问题讨论】:

    标签: node.js oauth google-calendar-api


    【解决方案1】:

    这是处理 oAuth2 令牌的正确方法吗?

    据我了解,是的。令牌是短暂的,一旦获得访问权,就会被新的令牌替换。

    访问令牌的生命周期有限。如果您的应用程序需要在单个访问令牌的生命周期之外访问 Google API,它可以获得刷新令牌。刷新令牌允许您的应用程序获取新的访问令牌。

    我能否继续在我的 API 请求中仅使用刷新令牌?

    如果令牌是范围的一部分,您可以继续使用令牌。

    访问令牌仅对令牌请求范围中描述的一组操作和资源有效。例如,如果为 Google+ API 颁发了访问令牌,则它不会授予对 Google Contacts API 的访问权限。但是,您可以将该访问令牌多次发送到 Google+ API 以进行类似操作。

    刷新令牌过期后会发生什么?

    访问令牌过期后,应用程序使用刷新令牌获取新令牌。

     

    一般来说,Identity 文档中的这张图表完整地说明了这个过程。

    有关客户端应用程序中的 oAuth2 的更多信息,请查看文档的 Web Apps 部分。

    【讨论】:

    • 当我使用访问令牌和刷新令牌设置凭据时,我收到 401 Invalid Credentials 错误。但是,如果我只使用刷新令牌,那么一切正常。从我以前看到的示例中,凭据总是使用两个令牌设置。这就是为什么我想知道我的过程是否正确。
    • 我认为这个过程是正确的。基于documentation,Refresh Token 将是获取Access Tokens 的那个。我认为这就是 2 个令牌如何相互协作。
    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 2023-03-18
    • 1970-01-01
    • 2018-11-07
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多