Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 获取访问令牌有效性_Node.js_Express_Oauth 2.0_Jwt_Passport.js - Fatal编程技术网

Node.js 获取访问令牌有效性

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将用户身份验证到我的应用程序中

我已经为同样的目标制定了passport策略

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的信息