ExpressJWT,如何配合JsonWebToken传递和使用令牌?
发布于 作者:苏南大叔 来源:程序如此灵动~

本文主要描述express
的jwt
中间件的使用方法,主要分为三部分内容,令牌的颁发,令牌的传递,令牌的鉴定。其中令牌的颁发,和上一篇文章JsonWebToken
里面的主要内容是一样的,另外两个部分是有所不同的。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:nodejs@20.18.0
,express@4.21.2
,jsonwebtoken@9.0.2
,express-jwt@8.5.1
。
准备工作
下面有两篇前置阅读内容,有助于本文的正确理解。
express
和JsonWebToken
的结合,就是express-jwt
这个中间件,它不能自动安装jsonwebtoken
,需要主动安装。
官方文档:
本文中的代码,可能出现的两个误区:
- 混淆
jsonwebtoken
和express-jwt
,前者是正主,后者是中间件,起到沟通的作用。 - 混淆
jsonwebtoken
的options
和express-jwt
的options
。两者虽然类似,但是控制的内容完全不同。
代码框架
express.js
:
颁发token
生成令牌的动作,依然是由jsonwebtoken
自身完成的。
客户端发起登陆请求:

express
处理请求,返回token
。
更多参数,可以参考:
传递令牌
浏览器拿到token
后,拼装到下一次的接口请求中。
使用中间件
和正版的JsonWebToken
不同的是:验证部分是由中间件express-jwt
来进行的,使用者是完全无感的。
- 它在
req
的headers
里面,解析出Authorization
信息,然后去掉Bearer
字符串,解析出token
。 - 根据
token
相关信息进行验证,解析的结果生成了一个req.auth
字段,其内容就是最开始颁发令牌时的payload
信息。
不使用中间件
中间件的.unless()
支持配置多个正则表达式(直接写url
也可以),对应的url
不会匹配jwt
信息。对于全局设置express-jwt
的时候,很重要。
这里的/login
和/api/*
都不会匹配生成req.auth
信息。可以发出这些地址的请求,查看返回结果。

其它 options
express-jwt
中间件的其它选项,举例:
参考:
错误处理
值得说明的是:在中间件authCheck
环节,令牌验证失败就会发出各种401
状态码,以及各种类型为UnauthorizedError
的错误码。会导致根本不会走到后续的路由函数正文环节。所以,路由的正文多数情况下可能就杞人忧天了。
为了捕获这些401
的UnauthorizedError
,可以修改全局的error
处理函数。把下面的代码,放置在所有路由的最后面。
由express-jwt
发出的401 (Unauthorized)
状态错误,有以下几种可能:
- UnauthorizedError: No authorization token was found
- UnauthorizedError: jwt malformed
- UnauthorizedError: The token has been revoked
- UnauthorizedError: jwt expired
结语
jwt
因为和状态无关,所以天然支持分布式处理。这也是和传统的session
方式的最大区别。
这里其实还少一个环节,就是refreshToken
的过程。请求到token
在过期前,都要过来refresh
至少一下,以期待得到新的合法token
。苏南大叔在后续文章里面,再讨论这种情况。


