1

我正在为 YouTube 创建一个应用程序,该应用程序利用了一些面向内容所有者的分析 API。API 需要具有足够权限的用户才能登录,然后该用户可以检索我们应用程序的所有用户的报告。

目前我们的应用程序可以获取 YouTube 用户 ID,这很好,但我们需要一个单独的帐户(当前用户除外)使用登录的用户 ID 向 API 发出请求。

我怎样才能实现这样的设置?我知道这将涉及使用脱机身份验证并定期刷新访问令牌,但我不太确定该怎么做。

4

1 回答 1

3

我已经完成了一个谷歌分析仪表板,它会在一段时间内刷新令牌。管理员选择 GA 配置文件并绘制内容。我需要使用一堆东西来做到这一点:

  1. Npm 集成- 非常易于使用。看看如何使方法调用同步。

  2. 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;
    }
});
于 2013-07-05T03:47:12.393 回答