获取访问令牌有效性

时间:2018-12-30 10:53:55

标签: node.js express oauth-2.0 jwt passport.js

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

我为同一个人创建了护照策略

sub mysub($foo);                               # Forward declaration
sub mysub2 { mysub(8) }
sub mysub  { mysub2('infinite loops ftw!') }   # Complete version of the code

(以上内容与我们通常创建的护照策略非常相似)

要获取上面的刷新令牌,我正在我的api路由中完成

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  })
    }
))

问题:这确实为我提供了访问令牌。我怎么知道访问令牌何时到期?

我的最初目标是,只要访问令牌过期,就可以通过刷新令牌获得新的访问令牌。

有人可以帮我实现这一目标吗?

2 个答案:

答案 0 :(得分:2)

要添加到上述答案中,oauth2 jwt令牌未加密就编码,因此您可以通过解码令牌轻松读取到期时间。 使用标准的jwt库,有两种常用的方法来验证令牌是否已过期。我使用https://www.npmjs.com/package/jsonwebtoken

假设您具有公共密钥或机密,请使用verify方法检查令牌是否已过期。如果您使用的令牌已过期,则会引发错误。

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

您可以在https://jwt.io/introduction/

上了解有关JWT的更多信息。

答案 1 :(得分:1)

OAuth令牌以加密格式包含其中的所有信息。它们是JWT令牌的一种形式,您可以轻松地解密令牌here

出于编程目的,您可以使用npm pakcages解析JWT。最好的实现方式之一是通过Auth0,它可以帮助您避免编写手动解密算法。