我有以下代码允许用户创建Google日历活动。最初它将检查用户是否设置了访问令牌,如果不是,它将启动常规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无效凭证"错误。我注意到如果我省略了access_token并且只是在oAuth2Client中设置了刷新令牌,那么一切都按预期工作。
这是处理oAuth2令牌的正确方法吗?我可以继续在API请求中仅使用刷新令牌吗?刷新令牌到期时会发生什么?任何帮助,将不胜感激。
答案 0 :(得分:0)
这是处理oAuth2令牌的正确方法吗?
据我所知,是的。令牌是短暂的,一旦访问,将被替换为新的。
访问令牌的生命周期有限。如果您的应用需要在单个访问令牌的生命周期之后访问Google API,则可以获取刷新令牌。刷新令牌允许您的应用程序获取新的访问令牌。
我可以继续仅在API请求中使用刷新令牌吗?
如果作为其范围的一部分,您可以继续使用该标记。
访问令牌仅对令牌请求范围中描述的操作和资源集有效。例如,如果为Google+ API发放了访问令牌,则它不会授予对Google通讯录API的访问权限。但是,您可以多次将该访问令牌发送到Google+ API以进行类似的操作。
刷新令牌过期后会发生什么?
一旦访问令牌过期,应用程序就会使用刷新令牌来获取新令牌。
通常,身份文档中的此图表完整地说明了该过程。
有关客户端应用程序中oAuth2的更多信息,请查看文档的Web Apps部分。