2013-07-03 2 views
1

Я создаю приложение для YouTube, которое использует некоторые API-интерфейсы Analytics для владельцев контента. API-интерфейсы требуют наличия у пользователя достаточных разрешений для входа в систему, которые затем могут получать отчеты для всех пользователей нашего приложения.Использование отдельной учетной записи Google для бэкэнд-процессов в MeteorJS

В настоящее время наше приложение может получать идентификаторы пользователей YouTube, что хорошо, но нам нужна отдельная учетная запись (отличная от текущего пользователя), чтобы делать запросы к API с помощью зарегистрированного идентификатора пользователя.

Как я могу реализовать такую ​​настройку? Я знаю, что это связано с использованием автономной проверки подлинности и периодическим обновлением токенов доступа, но я не совсем уверен, как это сделать.

ответ

3

Я сделал панель инструментов Google Analytics, которая обновляет токен в интервале. Администратор выбирает профиль GA, и он замышляет вещи. Мне нужно использовать кучу вещей, чтобы сделать это:

  1. Npm Integration - простота в использовании. Просто взгляните, как заставить методы вызвать синхронизацию.

  2. google-api-nodejs-client [alpha] - Интеграция с Npm выше. Он освежает маркер для вас автоматически, когда вы Make Authenticated Requests

Если вы не хотите использовать Google-АПИС-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

No prob :) Рад, что это сработало! – gabrielhpugliese

+0

Это обеспечило отличную базу для моей реализации этого. «google-api-nodejs-client» также существует с тех пор. – wizonesolutions

Смежные вопросы