我正在为YouTube创建一个应用程序,该应用程序利用一些针对内容所有者的Analytics API。 API要求具有足够权限的用户登录,然后可以为我们的应用程序的所有用户检索报告。
目前我们的应用程序可以获取YouTube用户ID,这很好,但我们需要一个单独的帐户(当前用户除外)才能使用登录用户的ID向API发出请求。
如何实施此类设置?我知道这将涉及使用离线身份验证并定期刷新访问令牌,但我不太清楚如何做到这一点。
答案 0 :(得分:3)
我已经完成了Google Analytics仪表板,可以在一个时间间隔内刷新令牌。管理员选择GA配置文件并绘制事物。我需要使用一堆东西来做到这一点:
Npm Integration - 这么容易使用。只需看看如何使方法调用同步。
google-api-nodejs-client [alpha] - 将其与上面的Npm集成。当您Make Authenticated Requests
如果您不想使用google-apis-nodejs-client刷新令牌,可以使用我自己刷新令牌的代码:
var googleAccount = Accounts.loginServiceConfiguration.findOne({service: 'google'});
CLIENT_ID = googleAccount.clientId;
CLIENT_SECRET = googleAccount.secret;
REDIRECT_URL = '/_oauth/google?close';
var googleapis = Meteor.require('googleapis'),
OAuth2Client = googleapis.OAuth2Client,
client = getClient();
function getClient () {
var client = Meteor.sync(function (done) {
googleapis.discover('analytics', 'v3').execute(function (err, client) {
done(err, client);
});
});
if (client.err)
throw new Meteor.Error(400, 'Client not received');
return client.result;
}
function getOAuth2Client (user) {
var accessToken = user.services.google.accessToken,
refreshToken = user.services.google.refreshToken,
oauth2Client = new OAuth2Client(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);
if (user.services.google.expiresAt < +(new Date())) {
var res = Meteor.http.call("POST", "https://accounts.google.com/o/oauth2/token",
{params: {
grant_type : 'refresh_token',
refresh_token : refreshToken,
client_id : CLIENT_ID,
client_secret : CLIENT_SECRET
}, headers: {
"content-type": "application/x-www-form-urlencoded"
}});
accessToken = res.data.access_token;
Meteor.users.update({_id: user._id}, {$set: {
'services.google.accessToken': accessToken,
'services.google.expiresAt': +(new Date()) + (1000 * res.data.expires_in)
}});
}
oauth2Client.credentials = {
access_token: accessToken,
refresh_token: refreshToken
};
return oauth2Client;
}
Meteor.methods({
'getAccounts': function () {
var user = Meteor.users.findOne({_id: this.userId}),
oauth2Client = getOAuth2Client(user),
accounts = getAccounts(oauth2Client, client);
return accounts;
}
});