2013-07-03 39 views
1

我正在爲YouTube創建一個應用程序,該應用程序利用Content Owners的一些Analytics API。 API需要具有足夠權限的用戶登錄,然後誰可以檢索我們應用程序的所有用戶的報告。在MeteorJS中爲後端流程使用單獨的Google帳戶

目前我們的應用程序可以獲得YouTube用戶ID,這很好,但我們需要一個單獨的帳戶(除當前用戶以外)使用登錄用戶的ID向API發出請求。

我該如何實現這樣的設置?我知道這將涉及使用脫機身份驗證並定期刷新訪問令牌,但我不太確定如何執行此操作。

回答

3

我已經完成了一個Google Analytics儀表板,可以在一段時間內刷新令牌。管理員選擇GA配置文件並繪製事物。我需要使用一堆東西來做到這一點:

  1. Npm Integration - 如此容易使用。只要看看如何使方法調用同步。

  2. google-api-nodejs-client [alpha] - 將它與上面的Npm集成。它會自動刷新你的令牌當你Make Authenticated Requests

如果你不希望使用谷歌的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; 
    } 
}); 
+0

對不起,遲到接受;這工作完美。謝謝! – troytc

+0

沒有問題:)很高興工作! – gabrielhpugliese

+0

這爲我實現這個提供了一個很好的基礎。自那時起,'google-api-nodejs-client'也出現了。 – wizonesolutions

相關問題