在MeteorJS中为后端进程使用单独的Google帐户

时间:2013-07-03 23:14:27

标签: javascript youtube-api meteor

我正在为YouTube创建一个应用程序,该应用程序利用一些针对内容所有者的Analytics API。 API要求具有足够权限的用户登录,然后可以为我们的应用程序的所有用户检索报告。

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

如何实施此类设置?我知道这将涉及使用离线身份验证并定期刷新访问令牌,但我不太清楚如何做到这一点。

1 个答案:

答案 0 :(得分:3)

我已经完成了Google Analytics仪表板,可以在一个时间间隔内刷新令牌。管理员选择GA配置文件并绘制事物。我需要使用一堆东西来做到这一点:

  1. Npm Integration - 这么容易使用。只需看看如何使方法调用同步。

  2. google-api-nodejs-client [alpha] - 将其与上面的Npm集成。当您Make Authenticated Requests

  3. 时,它会自动为您刷新令牌

    如果您不想使用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;
        }
    });