流星帐户 - 谷歌令牌到期 [英] Meteor accounts-google Token Expires

查看:122
本文介绍了流星帐户 - 谷歌令牌到期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有Accounts-UI配置设置为google存储离线令牌:

I have the Accounts-UI config setup to store an offline token for google thusly:

if (Meteor.isClient) {
 Accounts.ui.config({
  requestOfflineToken: { google: true },
  forceApprovalPrompt: { google: true },
  requestPermissions: { google: ["https://mail.google.com/"] }
 });
}

但是,令牌似乎已过期。我假设我需要以某种方式使用refreshToken。我不确定如何使用流星。任何帮助都很可爱。谢谢!

However, tokens seem to expire. I assume I need to somehow use the refreshToken. I'm not sure how though with meteor. Any help would be lovely. Thanks!

推荐答案

我建议使用Google API Node JS客户端刷新您的访问令牌。

I recommend using Google API Node JS client to refresh your access tokens.

https://github.com/google/google-api- nodejs-client /

它可用作服务器端NPM包,因此您可能希望使用这个软件包能够在你的Meteor应用程序中 npmRequire 它。

It's available as a server-side NPM package, so you might want to use this package to be able to npmRequire it in your Meteor app.

使用此 packages.json config加载最新的 googleapis 包:

Use this packages.json config to load the latest googleapis package :

{
  "googleapis": "2.1.5"
}

然后在您的Meteor服务器代码中,您将能够像这样刷新访问令牌:

Then in your Meteor server code you'll be able to refresh the access tokens like this :

ES2015

const GoogleApis = Meteor.npmRequire('googleapis');

function getAccessToken(user) {
  const googleService = user.services.google;
  // is token still valid for the next minute ?
  if (googleService.expiresAt < Date.now() + 60 * 1000) {
    // then just return the currently stored token
    return {
      access_token: googleService.accessToken,
      token_type: 'Bearer',
      id_token: googleService.idToken,
      expiry_date: googleService.expiresAt,
      refresh_token: googleService.refreshToken,
    };
  }
  // fetch google service configuration
  const googleServiceConfig = Accounts.loginServiceConfiguration.findOne({
    service: 'google',
  });
  // declare an Oauth2 client
  const oauth2Client = new GoogleApis.auth.OAuth2(googleServiceConfig.clientId, googleServiceConfig.secret);
  // set the Oauth2 client credentials from the user refresh token
  oauth2Client.setCredentials({
    refresh_token: user.services.google.refreshToken,
  });
  // declare a synchronous version of the oauth2Client method refreshing access tokens
  const refreshAccessTokenSync = Meteor.wrapAsync(oauth2Client.refreshAccessToken, oauth2Client);
  // refresh tokens
  const tokens = refreshAccessTokenSync();
  // update the user document with the fresh token
  Meteor.users.update(user._id, {
    $set: {
      'services.google.accessToken': tokens.access_token,
      'services.google.idToken': tokens.id_token,
      'services.google.expiresAt': tokens.expiry_date,
      'services.google.refreshToken': tokens.refresh_token,
    },
  });
  //
  return tokens;
}

以下是在使用Google之前如何刷新访问令牌的完整示例服务。

Here is a full example of how to refresh your access tokens before using a google service.

function listMeteorChannel() {
  // fetch a user you want to act on behalf who authorized offline access
  const user = Meteor.users.findOne({
    'services.google.refreshToken': {
      $exists: true,
    },
  });
  if (!user) {
    return;
  }
  const googleServiceConfig = Accounts.loginServiceConfiguration.findOne({
    service: 'google',
  });
  // declare oauth2 client and set credentials
  const oauth2Client = new GoogleApis.auth.OAuth2(googleServiceConfig.clientId, googleServiceConfig.secret);
  // get user access token
  const tokens = getAccessToken(user);
  oauth2Client.setCredentials(tokens);
  // obtain the youtube service at version 3 and perform authentication at service level
  const youtube = GoogleApis.youtube({
    version: 'v3',
    auth: oauth2Client,
  });
  // declare a synchronous version of youtube.channels.list
  const youtubeChannelsListSync = Meteor.wrapAsync(youtube.channels.list, youtube.channels);
  // fetch an info snippet from the Meteor official YouTube channel
  const result = youtubeChannelsListSync({
    part: 'snippet',
    // Meteor channel ID
    id: 'UC3fBiJrFFMhKlsWM46AsAYw',
  });
  result.items.forEach((item) => {
    // display the channel title, which should be 'Meteor'
    console.log(item.snippet.title);
  });
}

Meteor.startup(listMeteorChannel);

这篇关于流星帐户 - 谷歌令牌到期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆