如何生成签名JWT替代Bearer token实现API授权?
关于返回报文是否为JWT的确认
你拿到的这串返回报文不是未签名/未编码的JWT。这是OAuth2.0令牌端点返回的标准JSON响应结构,其中只有access_token字段对应的<long string>值才是实际的授权令牌,你可以通过判断该值是否由两个.分隔的三段Base64编码字符串组成,确认它是否为JWT格式,否则就是普通不透明令牌。
问题1:已有材料如何生成签名JWT
生成签名JWT的标准操作如下:
- 准备三类核心材料
- 头部(Header):JSON格式,需声明签名算法(如HS256、RS256)和固定令牌类型
JWT,示例:{"alg":"HS256","typ":"JWT"} - 载荷(Payload):JSON格式,即你持有的声明列表,可搭配过期时间
exp、签发主体iss等标准字段使用 - 签名密钥:使用对称加密算法需提供共享密钥,使用非对称加密算法需提供私钥,密钥需严格保密不可泄露
- 头部(Header):JSON格式,需声明签名算法(如HS256、RS256)和固定令牌类型
- 分别对头部、载荷做Base64URL编码,注意该编码规则和普通Base64有差异:需替换
+为-、替换/为_、删除末尾的=填充符 - 拼接编码后的头部和载荷,中间用
.分隔,得到待签名串:[Base64URL(Header)].[Base64URL(Payload)] - 按照头部指定的签名算法,用密钥对待签名串做签名,再将签名结果做Base64URL编码
- 把编码后的头部、载荷、签名结果用
.拼接,得到最终的签名JWT:[Base64URL(Header)].[Base64URL(Payload)].[Base64URL(Signature)]
实际开发无需手动实现上述编码、签名逻辑,各主流编程语言都有成熟的JWT工具库,仅需传入头部参数、载荷声明、密钥即可直接生成合规的签名JWT。
问题2:签名JWT如何传递给API端点
传递方式和原Bearer token完全一致,直接替换原有令牌内容即可:
- 在HTTP请求头中添加
Authorization字段,字段值为Bearer [你生成的签名JWT],注意Bearer和JWT字符串之间需保留一个空格
示例请求头:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
如果目标API有特殊要求需将令牌放在请求参数、请求体中,按照API文档要求替换原有Bearer token的位置即可,绝大多数场景都采用上述Authorization请求头的传递方式。
内容的提问来源于stack exchange,提问作者Matt W
相关产品推荐
相关产品推荐

