Node.js 获取访问令牌有效性
我正在使用passport将用户身份验证到我的应用程序中 我已经为同样的目标制定了passport策略Node.js 获取访问令牌有效性,node.js,express,oauth-2.0,jwt,passport.js,Node.js,Express,Oauth 2.0,Jwt,Passport.js,我正在使用passport将用户身份验证到我的应用程序中 我已经为同样的目标制定了passport策略 passport.use(new GoogleStrategy({ clientID: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, callbackURL: process.env.GOOGLE_CALLBACK_URL, userProfileUR
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 })
}
))
(以上与我们通常创建的passport策略非常相似)
为了获得上面的刷新令牌,我在我的api路由中这样做
router.get("/google", passport.authenticate('google', {accessType: 'offline', prompt: 'consent', scope: ['profile', 'email', 'https://mail.google.com/' ] }));
问题:这确实给了我一个访问令牌。我如何知道访问令牌何时过期
我最初的目标是在访问令牌过期时通过刷新令牌获得新的访问令牌
有人能帮我怎么做到这一点吗?OAuth令牌以加密格式包含其中的所有信息。它们是JWT令牌的一种形式,您可以轻松地解密令牌
出于编程目的,可以使用npm pakcages解析JWT。最好的实现之一是通过,这将帮助您避免编写手动解密算法。为了补充上述答案,oauth2 jwt令牌是编码而非加密的,因此您可以通过解码令牌轻松读取到期时间。 有两种常用方法可以使用标准jwt库验证令牌是否过期。我用 假设您拥有公钥或密码,请使用验证方法检查令牌是否过期。如果您使用的是过期的令牌,则会引发错误
var jwt = require('jsonwebtoken');
var token ='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE1NDYzOTYxMDYsImV4cCI6MTU0NjM5NjEwN30.qFeaKny2Ruk7ZeZsHGpPcw6aksyZHUfDOmb6EvgiGIo';
var verified = jwt.verify(token, 'secret');
使用解码方法解码令牌。您可以从解码对象的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'});
您可以在这里阅读更多关于JWTs的信息