我正在为 YouTube 创建一个应用程序,该应用程序利用了一些面向内容所有者的分析 API。API 需要具有足够权限的用户才能登录,然后该用户可以检索我们应用程序的所有用户的报告。
目前我们的应用程序可以获取 YouTube 用户 ID,这很好,但我们需要一个单独的帐户(当前用户除外)使用登录的用户 ID 向 API 发出请求。
我怎样才能实现这样的设置?我知道这将涉及使用脱机身份验证并定期刷新访问令牌,但我不太确定该怎么做。
我正在为 YouTube 创建一个应用程序,该应用程序利用了一些面向内容所有者的分析 API。API 需要具有足够权限的用户才能登录,然后该用户可以检索我们应用程序的所有用户的报告。
目前我们的应用程序可以获取 YouTube 用户 ID,这很好,但我们需要一个单独的帐户(当前用户除外)使用登录的用户 ID 向 API 发出请求。
我怎样才能实现这样的设置?我知道这将涉及使用脱机身份验证并定期刷新访问令牌,但我不太确定该怎么做。
我已经完成了一个谷歌分析仪表板,它会在一段时间内刷新令牌。管理员选择 GA 配置文件并绘制内容。我需要使用一堆东西来做到这一点:
Npm 集成- 非常易于使用。看看如何使方法调用同步。
google-api-nodejs-client [alpha] - 将它与上面的 Npm 集成。当您发出经过身份验证的请求时,它会自动为您刷新令牌
如果您不想使用 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;
}
});