Meteor Google oAuth 无需重新登录即可刷新 accessToken

Meteor Google oAuth to refresh accessToken without re-login

这是我的第一个 post。我会努力做到完整。我正在 Meteor 中创建一个使用 google oAuth 的应用程序。我正在使用以下软件包:

accounts-ui
accounts-google
service-configuration
google-config-ui

在我的 login.js 我有:

Template.login.events({
  'click #googleLoginButton': function() {
    Meteor.loginWithGoogle(
      { requestPermissions: ['email', 'profile'],
      requestOfflineToken: 'true'
      }
     );
  }
});

我在 mongo 中得到以下内容:

db.users.find({}).pretty();
{
    "_id" : "9TjGEjEj4ocFhwHtS",
    "createdAt" : ISODate("2017-10-11T17:38:07.400Z"),
    "services" : {
        "google" : {
            "accessToken" : "ya29.-REDACTED-T9z",
            "idToken" : "eyJhbGcj-REDACTED-LTg",
            "scope" : [
                "https://www.googleapis.com/auth/userinfo.email",
                "https://www.googleapis.com/auth/userinfo.profile"
            ],
            "id" : "107113228066746203535",
            "email" : "XXXXXXy@XXXX.com",
            "verified_email" : true,
            "name" : "XXX XXX",
            "given_name" : "XXX",
            "family_name" : "XXX",
            "picture" : "https://lh4.googleusercontent.com/.../photo.jpg",
            "locale" : "en",
            "gender" : "male",
            "refreshToken" : "1/HG-REDACTED-oLq0USutc"
        },
        "resume" : {
            "loginTokens" : [
                {
                    "when" : ISODate("2017-10-11T21:47:38.471Z"),
                    "hashedToken" : "2lmOK-REDACTED-ptAyDnWo="
                }
            ]
        }
    },
    "profile" : {
        "name" : "XXX XXX"
    }
}

在 Server/init.js 中我有:(我通过 settings.json 传递 google 项目信息)

configureGoogle = function(config) {
    ServiceConfiguration.configurations.remove({
        service: "google"
    });

    ServiceConfiguration.configurations.insert({
        service: "google",
        clientId: googleConfig.clientId,
        secret: googleConfig.secret
    });
    return;
};

if (googleConfig) {
    console.log('Got settings for google', googleConfig)
    configureGoogle(googleConfig);
}

看来一切正常。我可以登录/退出,当我登录时我会得到新的令牌。我在其他地方使用 accessToken 进行 api 调用。我遇到的问题是,一小时后令牌过期并且 API 调用开始失败。

我想在 accessToken 过期之前刷新它,但似乎无法弄清楚如何。我还想在 24 小时后强制注销,这样令牌就不会永远刷新。

感谢任何帮助。

更新 #1

感谢下面的 Derek Brown 为我指明了正确的方向。这让我开始寻找流星 google api。我找到了这个:percolate:google-api

根据它的文档,它可以满足我的需求:

If the user's access token has expired, it will transparently call the exchangeRefreshToken method to get a new refresh token.

然后我 运行 进入了一个错误,其中 expiresAt 在我的 mongodb 中不存在并且事情没有工作。然后我发现这个 post: Google-API 建议:

server/publish.js

Meteor.publish(null, function() {
  return Meteor.users.find(this.userId, { fields: { 
    'services.google.accessToken': 1, 
    'services.google.expiresAt': 1 
  }});
});

我还对上面的代码做了一处修改: client/login.js

Template.login.events({
  'click #googleLoginButton': function() {
    Meteor.loginWithGoogle(
      { requestPermissions: ['email', 'profile'],
      requestOfflineToken: 'true',
      forceApprovalPrompt: 'true' //<==== This is the change
      }
     );
  }
});

添加了 expiresAt 并填充了它。

我现在正在进行最终测试。我会更新的。