node.js - 获取访问令牌有效性
问题描述
我正在使用护照将用户身份验证到我的应用程序中
我为此创建了护照策略
passport.use(new GoogleStrategy({
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: process.env.GOOGLE_CALLBACK_URL,
userProfileURL: 'https://www.googleapis.com/oauth2/v3/userinfo',
accessType: 'offline'
}, (accessToken, refreshToken, profile, cb) => {
console.log(refreshToken)
let profileSort = extractProfile(profile)
mongooeHelperFunction.findUserByEmail(profileSort.email).then(response => {
if (!response) {
mongooeHelperFunction.createNewUser(profileSort)
.then(res => {
let newRes = {...res}
newRes["accessToken"] = accessToken
cb(null, newRes)
})
.catch(error => { throw error })
} else {
let newRes = {...response}
newRes["accessToken"] = accessToken
cb(null, newRes)
}
})
.catch(error => { throw error })
}
))
(上面和我们平时创建的护照策略很相似)
要获得上面的刷新令牌,我在我的 api 路由中执行此操作
router.get("/google", passport.authenticate('google', {accessType: 'offline', prompt: 'consent', scope: ['profile', 'email', 'https://mail.google.com/' ] }));
问题:这确实给了我一个访问令牌。我如何知道访问令牌何时到期?
我最初的目标是在访问令牌过期时通过刷新令牌获取新的访问令牌。
谁能帮助我如何实现这一目标?
解决方案
要添加到上述答案,oauth2 jwt 令牌编码未加密,因此您可以通过解码令牌轻松读取到期时间。使用标准 jwt 库有 2 种常用方法来验证令牌是否已过期。我使用https://www.npmjs.com/package/jsonwebtoken
假设您拥有公钥或密钥,请使用 verify 方法检查令牌是否已过期。如果您使用过期的令牌,则会引发错误。
var jwt = require('jsonwebtoken');
var token ='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE1NDYzOTYxMDYsImV4cCI6MTU0NjM5NjEwN30.qFeaKny2Ruk7ZeZsHGpPcw6aksyZHUfDOmb6EvgiGIo';
var verified = jwt.verify(token, 'secret');
使用 decode 方法对令牌进行解码。您可以从解码对象中的 exp 字段中获取到期时间
var jwt = require('jsonwebtoken');
var token ='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE1NDYzOTYxMDYsImV4cCI6MTU0NjM5NjEwN30.qFeaKny2Ruk7ZeZsHGpPcw6aksyZHUfDOmb6EvgiGIo';
var decoded = jwt.decode(token);
console.log('Expiry timestamp----------->', decoded.exp);
同样为了测试这一点,请确保您在创建 JWT 时设置到期时间
var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'secret', {expiresIn: '1h'});
您可以在此处阅读有关 JWT 的更多信息https://jwt.io/introduction/
推荐阅读
- oracle - 有没有办法在 RAC 中强制实例执行 oracle 调度程序链作业
- rust - 匹配文档注释的宏规则
- c# - 如何为 IEnumerable 制作扩展方法
? 我应该在哪里申报? - wordpress - Contact Form 7 在电子邮件的多个复选框中添加换行符
- meteor - 如何使用 FlowRouter 解析任何给定的 url?
- qt - 仅在发出 n 个信号时才调用插槽?
- java - 从 maven 构建一个战争和可执行 jar
- php - 在 Laravel 中,如何检查用户是否从包中登录?
- javascript - 为什么 loadmore 不加载并显示特定数量的孩子?
- c# - 如何将 byte[] 数组中的图像转换为 Xamarin.IOS UIImage 控件