我建议使用Google API Node JS客户端来刷新您的访问令牌。
它作为服务器端NPM包可用,因此您可能希望使用此软件包,在Meteor应用程序中使用
npmRequire
。
使用此
packages.json
配置加载最新的
googleapis
软件包:
{
"googleapis": "2.1.5"
}
然后在您的Meteor服务器代码中,您可以像这样刷新访问令牌:
ES2015
(指JavaScript编程语言的一个版本)
const GoogleApis = Meteor.npmRequire('googleapis');
function getAccessToken(user) {
const googleService = user.services.google;
if (googleService.expiresAt < Date.now() + 60 * 1000) {
return {
access_token: googleService.accessToken,
token_type: 'Bearer',
id_token: googleService.idToken,
expiry_date: googleService.expiresAt,
refresh_token: googleService.refreshToken,
};
}
const googleServiceConfig = Accounts.loginServiceConfiguration.findOne({
service: 'google',
});
const oauth2Client = new GoogleApis.auth.OAuth2(googleServiceConfig.clientId, googleServiceConfig.secret);
oauth2Client.setCredentials({
refresh_token: user.services.google.refreshToken,
});
const refreshAccessTokenSync = Meteor.wrapAsync(oauth2Client.refreshAccessToken, oauth2Client);
const tokens = refreshAccessTokenSync();
Meteor.users.update(user._id, {
$set: {
'services.google.accessToken': tokens.access_token,
'services.google.idToken': tokens.id_token,
'services.google.expiresAt': tokens.expiry_date,
'services.google.refreshToken': tokens.refresh_token,
},
});
return tokens;
}
这里是一个完整的示例,展示如何在使用Google服务之前刷新访问令牌。
function listMeteorChannel() {
const user = Meteor.users.findOne({
'services.google.refreshToken': {
$exists: true,
},
});
if (!user) {
return;
}
const googleServiceConfig = Accounts.loginServiceConfiguration.findOne({
service: 'google',
});
const oauth2Client = new GoogleApis.auth.OAuth2(googleServiceConfig.clientId, googleServiceConfig.secret);
const tokens = getAccessToken(user);
oauth2Client.setCredentials(tokens);
const youtube = GoogleApis.youtube({
version: 'v3',
auth: oauth2Client,
});
const youtubeChannelsListSync = Meteor.wrapAsync(youtube.channels.list, youtube.channels);
const result = youtubeChannelsListSync({
part: 'snippet',
id: 'UC3fBiJrFFMhKlsWM46AsAYw',
});
result.items.forEach((item) => {
console.log(item.snippet.title);
});
}
Meteor.startup(listMeteorChannel);