首页 > 解决方案 > 获取访问令牌有效性

问题描述

我正在使用护照将用户身份验证到我的应用程序中

我为此创建了护照策略

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/' ] }));

问题:这确实给了我一个访问令牌。我如何知道访问令牌何时到期?

我最初的目标是在访问令牌过期时通过刷新令牌获取新的访问令牌。

谁能帮助我如何实现这一目标?

标签: node.jsexpressoauth-2.0jwtpassport.js

解决方案


要添加到上述答案,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/


推荐阅读