首页 > 其他分享 >express JWT

express JWT

时间:2023-07-29 20:32:37浏览次数:31  
标签:name res express JWT json token

jwt(json web token)

主要是做鉴权用的登录之后存储用户信息

下面这段就是生成的token(令牌) eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFGv4KXqUhlRHglGCESvcJEnyMkMwM1WfICt8xYC4

JWT是三部分组成的

  • 头部(Header):头部通常由两部分组成:令牌的类型(即 "JWT")和所使用的签名算法。头部通常采用 JSON 对象表示,并进行 Base64 URL 编码。
{
  "alg": "HS256",
  "typ": "JWT"
}

alg:代表所使用的签名算法,例如 HMAC SHA256(HS256)或 RSA 等。 typ:代表令牌的类型,一般为 "JWT"。

  • 负载(Payload):负载包含所要传输的信息,例如用户的身份、权限等。负载也是一个 JSON 对象,同样进行 Base64 URL 编码。
{
  "iss": "example.com",
  "exp": 1624645200,
  "sub": "1234567890",
  "username": "johndoe"
}

iss:令牌颁发者(Issuer),代表该 JWT 的签发者。 exp:过期时间(Expiration Time),代表该 JWT 的过期时间,以 Unix 时间戳表示。 sub:主题(Subject),代表该 JWT 所面向的用户(一般是用户的唯一标识)。 自定义声明:可以添加除了预定义声明之外的任意其他声明。

  • 签名(Signature):签名是使用私钥对头部和负载进行加密的结果。它用于验证令牌的完整性和真实性。
HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secretKey
    )

express jwt demo

安装

pnpm i express
pnpm i jsonwebtoken
pnpm i cors
import express from 'express';
import jwt from 'jsonwebtoken';
import cors from 'cors';
const app = express();
const secretKey = 'xmzs' //加盐

app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use(cors())

let user = { name: 'admin', password: '123456', id: 1 } //模拟用户信息

app.post('/api/login', (req, res) => {
    console.log(req.body)
    if (req.body.name == user.name && req.body.password == user.password) {
        res.json({
            message: '登录成功',
            code: 200,
            token: jwt.sign({ id: user.id }, secretKey, { expiresIn: 60 * 60 * 24 }) //生成token
        })
    } else {
        res.json({
            message: '登录失败',
            code: 400
        })
    }
})


app.get('/api/list', (req, res) => {
    console.log(req.headers.authorization)
    jwt.verify(req.headers.authorization as string, secretKey, (err, data) => { //验证token
        if (err) {
            res.json({
                message: 'token失效',
                code: 403
            })
        } else {
            res.json({
                message: '获取列表成功',
                code: 200,
                data: [
                    { name: '张三', age: 18 },
                    { name: '李四', age: 20 },
                ]
            })
        }
    })
})




app.listen(3000, () => {
    console.log('server is running 3000');
})

在这段代码中,设置了应用使用的中间件,包括处理 URL 编码和 JSON 格式数据的中间件以及跨域资源共享(CORS)中间件。

然后,定义了一个模拟的用户信息对象 user,包含了用户名、密码和用户 ID。

接下来,设置了一个 /api/login 的 POST 路由,用于用户登录验证。当接收到请求时,比较请求体中的用户名和密码与预设的 user 对象中存储的用户名和密码是否匹配。如果匹配,则返回登录成功的 JSON 响应,并使用 jsonwebtoken 的 sign 方法生成一个 JWT,其中包含用户的 ID 信息,并设置了过期时间为 24 小时。

如果用户名和密码不匹配,则返回登录失败的 JSON 响应。

接着,设置了一个 /api/list 的 GET 路由,用于获取列表数据。当接收到请求时,从请求头中获取存储的 JWT(通过 req.headers.authorization),并使用 jsonwebtoken 的 verify 方法验证 JWT 的有效性。如果验证失败,则返回 token 失效的 JSON 响应;如果验证通过,则返回成功获取列表数据的 JSON 响应,并返回一些模拟的数据。

最后,通过调用 app.listen 方法启动应用,监听在 3000 端口上,并输出服务器运行的提示信息。

这段代码实现了基本的用户登录验证和通过 JWT 鉴权的接口,在登录成功后生成的 JWT 中包含了用户的 ID 信息,从而在后续请求中进行验证和授权

前端

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <div>
        <div>
            <span>账号</span> <input id="name" type="text">
        </div>
        <div>
            <span>密码</span> <input id="password" type="password">
        </div>
        <button id="btn">登录</button>
    </div>

    <script>
        const btn = document.querySelector('#btn')
        const name = document.querySelector('#name')
        const password = document.querySelector('#password')

        btn.onclick = () => {
            fetch('http://localhost:3000/api/login', {
                body: JSON.stringify({
                    name: name.value,
                    password: password.value
                }),
                headers: {
                    'Content-Type': 'application/json'
                },
                method: 'POST',
            }).then(res => res.json()).then(res => {
                localStorage.setItem('token', res.token)
                location.href = './list.html'
            })
        }
    </script>
</body>

</html>

list.html 如果没有token就访问不了

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>List</title>
</head>

<body>
    <script>
        console.log(localStorage.getItem('token'))
        fetch('http://localhost:3000/api/list', {
            headers: {
                'Authorization':`Bearer ${localStorage.getItem('token')}`
            }
        }).then(res => res.json()).then(res => {
            console.log(res)
        })
    </script>
</body>

</html>

标签:name,res,express,JWT,json,token
From: https://blog.51cto.com/u_13463935/6895155

相关文章

  • asp.net core 2.0 web api基于JWT自定义策略授权
    原文通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端验证通过即可能获取想要访问的资源。关于JWT的技术,可参考网络上文章,这里不作详细说明,这篇博文,主要说明在asp.netcore2.0中,基于jwt的webapi的权限设置,即在asp.netcore中怎么用JWT,再次......
  • Asp.Net Core 集成JWT采用Rsa非对称密钥并实现自定义身份验证
    授权和鉴权分为了两个项目。首先是授权:建立Asp.netcore项目,并在Nuget包安装System.IdentityModel.Tokens.Jwt新建一个WebApi用于登录,这里使用账户密码方便调试。另外BaseResult是我封装的一个统一返回数据类型。需要注意的是audience以及JwtRegisteredClaimNames.Name......
  • JWT如何配置
    JWT就是jsonwebtoken,主要用在前后端分离中用户验证的令牌。它包含头,声明,算法三个部分。头拥有:1.类型typ:JWT2.算法alg:HS256 它是基于客户端的验证,而session是基于服务端的会话验证。它没有保存在cookie中,而是保存在header中,避免了CSRF攻击。而且它减轻了服务端......
  • DevExpress 按钮列点击多次才出发ButtonClick事件
    解决多次点击才能出现拉框,解决方法把GridView的EditorShowMode的模式选择了Click,应改为MouseDown就好了。图示位置: ......
  • 【Java异常】Variable used in lambda expression should be final or effectively fi
    https://blog.csdn.net/weixin_44299027/article/details/117333667*lambda表达式中使用的变量应该是final或者有效的final*,也就是说,lambda表达式只能引用标记了final的外层局部变量,这就是说不能在lambda内部修改定义在域外的局部变量,否则会编译错误......
  • DevExpress WPF Tree List组件,让数据可视化程度更高!(一)
    DevExpressWPFTreeList组件是一个功能齐全、数据感知的TreeView-ListView混合体,可以把数据信息显示为REE、GRID或两者的组合,在数据绑定或非绑定模式下,具有完整的数据编辑支持。DevExpressWPF 拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过......
  • sql server express
    SQLServerExpressSQLServerExpressisalightweight,freeeditionofMicrosoft'sSQLServerdatabasemanagementsystem.Itprovidesareliableandefficientplatformformanagingandstoringdata.Inthisarticle,wewillexplorethefeaturesand......
  • nodejs sqlite报错 typeorm[ Expression tree is too large (maximum depth 1000)]
    最近在给公司开发一个工具时,使用SQLite,然后突然发现报错:(node:16195)UnhandledPromiseRejectionWarning:QueryFailedError:SQLITE_ERROR:Expressiontreeistoolarge(maximumdepth1000)athandler(/snapshot/server-work/node_modules/typeorm/driver/sqlite/Sql......
  • Net6之Jwt认证+Bearer认证 2.0
    以前接触过,写过博客,第二次再写有了新的体会。第一次博客:https://www.cnblogs.com/zhang-3/p/16184067.html过程:生成token令牌(钥匙)添加bearer认证(验证钥匙是否正确)给接口或控制器添加验证(锁)给接口添加显示的小锁1.引入包:System.IdentityModel.Tokens.Jwt这次博客比......
  • DevExpress中GridControl控件的基本属性设置和使用方法
    (18条消息)DevExpress中GridControl控件的基本属性设置和使用方法_gridcontrol隐藏列_潘达小新的博客-CSDN博客......