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 并填充了它。
我现在正在进行最终测试。我会更新的。
这是我的第一个 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 并填充了它。
我现在正在进行最终测试。我会更新的。