在MeteorJS中使用单独的Google帐户进行后端处理



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

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

如何实现这样的设置?我知道这将涉及使用离线身份验证和定期刷新访问令牌,但我不太确定如何做到这一点

我做了一个Google Analytics面板,它在一段时间内刷新令牌。管理员选择GA配置文件并绘制内容。我需要用一堆东西来做到这一点:

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

  2. googleapi nodejs客户端〔alpha〕-将其与上面的Npm集成。当您进行身份验证请求时,它会自动为您刷新令牌

如果你不想使用谷歌api nodejs客户端来刷新你的令牌,你可以使用我自己制作的代码来刷新令牌:

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;
    }
});

相关内容

  • 没有找到相关文章

最新更新