在 oauth20 中集成 json Web 令牌

Posted

技术标签:

【中文标题】在 oauth20 中集成 json Web 令牌【英文标题】:Integrating json web token in oauth20 【发布时间】:2019-09-30 08:04:57 【问题描述】:

我正在尝试创建一个 api,用户可以使用电子邮件注册或使用 google 登录,我使用 json Web 令牌进行身份验证和 oauth20,问题是,我可以通过 oauth 传递 jwt 吗?

我已经尝试传递它,并且如果我得到一个令牌,我控制台日志,但是我如何将它传递给用户,就像我可以通过 oauth 以某种方式将它附加到 cb 中的 req.user 对象或类似的东西?

我在谷歌策略中这样做:

 async (accessToken, refreshToken, params, profile, cb) => 

   const userCheck = await User.findOne( googleId: profile.id );

 if (userCheck) 
        const payload = 
          user: 
            id: userCheck.id
          
        ;

        jwtToken.sign(
          payload,
          config.get("jwtSecret"),
           expiresIn: 360000 ,
          (err, token) => 
            if (err) 
              throw err;
            
            //   console.log(token);
            return res.json( token );
          ,
          cb(null, userCheck)
        );

我的路线受到这样的保护:

router.get("/", auth, async (req, res)=>
...some code
    

其中 auth 是一个中间件函数

这是Auth中间件函数:

module.exports = function(req, res, next)

  const token = req.header("x-auth-token");

  // If no token found


 if (!token)
 
    return res.status(401).json( msg: "User not authorized" );
  

  // Set token to user

 try 
    const decoded = jwtToken.verify(token, config.get("jwtSecret"));

     req.user = decoded.user;
   

 catch (err)
 
    res.
status(401)
.json( msg: "User not authenticated, please login or sign up" );
  
  next();

;

【问题讨论】:

【参考方案1】:

我找到了解决方案,您需要在passport.serializeUser 中传递标记,然后通过重定向发送它以响应重定向 url。

序列化用户函数:

passport.serializeUser(async (user, cb) => 
  const payload = 
    user: 
      id: user.id
    
  ;
  token = jwtToken.sign(payload, config.get("jwtSecret"), 
    expiresIn: 360000
  );
  console.log("serialize");
  cb(null, user.id);
);

重定向路由:

router.get(
  "/google/redirect",
  passport.authenticate("google",  sessionStorage: false ),
  (req, res) => 
    res.redirect("/" + token);
  
);

【讨论】:

以上是关于在 oauth20 中集成 json Web 令牌的主要内容,如果未能解决你的问题,请参考以下文章

在 Asp.net Web 服务中集成 JWT

撤销/使 .boto 文件(gsutil config)中生成的 oauth2 刷新令牌无效

ASP .NET Web Api OAuth 刷新令牌过期时间

在Application中集成Microsoft Translator服务之获取访问令牌

Spring以编程方式生成oauth2访问令牌

每个 refreshToken 的 OAuth2 访问令牌限制