【问题标题】:How to add refresh token?如何添加刷新令牌?
【发布时间】:2022-01-18 09:37:08
【问题描述】:

我有以下代码我想添加刷新令牌。我怎样才能添加它? 我也在征求关于如何提高授权方法质量的建议。
不幸的是,我的尝试总是以错误或缺少特定操作而告终。
这是我的sn-p代码:

const path = require('path');
const express = require('express');
const bodyParser = require('body-parser');
const urlencodedParser = bodyParser.urlencoded({ extended: false });
const mysql = require('mysql2');
const jwt = require('jsonwebtoken');
require('dotenv').config();
const TOKEN_SECRET = process.env.TOKEN_SECRET;

const app = express();
app.use(express.json());

const pathPublic = path.join(__dirname, '../public');
app.use(express.static(pathPublic));



app.post('/login', urlencodedParser, (req, res) => {
res.get(req.body.username + req.body.password);

const users = {
    username: req.body.username,
    password: req.body.password
};

// Connect to MySql
const db = require('./dbconnect');

// Select user:
const post = [users.username, users.password]
const sql = 'SELECT * FROM users WHERE name = ? AND password = ?';
const query = db.query(sql, post, (err, results) => {
    if (err) {
        throw err;
    } else if (results.length >= 1) {
        console.log("Successful login!!");

        const token = generateAccessToken({ username: users.username });
        res.redirect(`/admin?token=${token}`);

     } else if (results.length <= 0) {
         console.log("Not find user");
    }

 })

})

function generateAccessToken(username) {
  return jwt.sign(username, TOKEN_SECRET, { expiresIn: '600s' });
}

function authenticateToken(req, res, next) {
  token = req.query.token;
  if (token == null) return res.sendStatus(401);

jwt.verify(token, TOKEN_SECRET, (err, user) => {
  if (err) console.log(err);

  if (err) return res.sendStatus(403);

  req.user = user;

  next();
});
}

app.get('/admin', authenticateToken, (req, res) => {
res.send('admin panel');
});

【问题讨论】:

  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: node.js express jwt


【解决方案1】:

在 Nodejs 中有多种实现刷新令牌的方法,我经常使用的一种方法是生成一个过期时间比访问令牌更长的新 JWT,例如访问 30 分钟,刷新 48 小时,为了区分这些标记,我添加了一个名为 type 的额外有效负载,您放入该属性的值是您的,但它可以是简单的文本,如 ACCESSREFRESH,然后我会修改认证中间件来验证token,验证type属性是否等于ACCESS,如果属性值不同我会发送一个未授权的响应,当token访问无效时,我会使用刷新 jwt 生成一个新的访问权限,为此我将创建另一个中间件,该中间件从令牌中提取信息并验证类型是否等于 REFRESH 如果一切正确,那么我将生成一个两个新令牌一个用于访问,另一个用于刷新. 这是基本实现,您可以通过多种方式对其进行改进,例如设置一个黑名单以允许仅使用一次刷新令牌,但这是大体思路。

可以在here找到一个例子。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2020-07-12
  • 2017-05-29
  • 2020-11-11
  • 2012-10-08
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多