当前位置: 首页 > 后端技术 > Node.js

JSONWebToken介绍

时间:2023-04-03 21:23:52 Node.js

在API驱动开发的今天,对API的认证和授权越来越重要,这是保证数据安全的第一步。随着实践的不断进步,也引入了基于令牌授权的机制。其中比较知名的有:HTTPBasicAPIKeyOAuth2JSONWebToken(JWT)。它们都有不同的适用场景。这里我们只对JWT做一个简单的介绍。JWT是由互联网工程任务组(IETF)开发的开放标准,归档为RFC7519JWT两个优点:体积小:由于体积小,JWT可以通过URL、POST参数或在HTTP标头内发送。此外,更小的尺寸意味着更快的传输速度。自包含:Token的加载部分可以包含用户所有必要的信息,避免多次查询数据库.yyyyy.zzzzz,每部分都是基于base64url编码的值。Header部分通常Header部分包含两个值,typ表示token类型,alg表示hash算法,如:{"typ":"JWT","alg":"HS256"}Payload部分包含声明数据申报数据一共有三种类型:Registered、Public、Private。不需要所有申报数据。这种类型的注册声明是预定义的,每个都有特定的含义。通常推荐这种类型的声明,因为它们使JWT数据更合理。目前注册的类型有:iss:issuer的缩写,表示JWTissue的主题sub:subject的缩写,表示JWT的主题,这个值必须在上下文中唯一或者全局唯一aud:audience的缩写,表示JWT接收者exp:expiration的缩写,表示过期时间,其值必须是Unix时间戳的简写nbf:不是之前,表示JWT的有效时间,其值必须是Unix的简写timestampiat:issuedat,表示JWT的发布时间jti:JWTID的简写,表示JWT的唯一标识Public此类声明可以由JWT用户自由定义,但通常为了避免冲突,我们需要使用在IANAJSONWeb令牌注册表中注册的那个,或者定义为包含抗冲突命名空间的URI。这种类型的私有声明可以由JWT用户自由定义,但通常我们需要使用Registered和Public以外的东西。{"iss":"api","exp":1300819380,"email":"test@email.com","hobby":"basketball"}Signature创建签名必须使用encodedHeader,EncodedPayload、加密密钥和签名算法。签名的计算逻辑:HMACSHA256(base64UrlEncode(header)+'.'+base64UrlEncode(payload),secret)从上面的计算方式可以看出JWT只是保证数据不可篡改,并不保证数据不能被窥探。假如我们的secret值为'password',那么由本篇内容中罗列的示例数据计算出的最终JWT值为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcGkiLCJleHAiOjEzMDA4MTkzODAsImVtYWlsIjoidGVzdEBlbWFpbC5jb20iLCJob2JieSI6ImJhc2tldGJhbGwifQ.hKYJybV4u0Rc4oIB7l7LKbHWbKlMM1dkquq53MM5N2Q我们可以在JWTDebugger进行验证.JWT的使用JWT可以通过任何方式从客户endtotheserver,butusuallyusedintheauthenticationprocessoftheAPIHTTP-BearerAuthorization:BearerThefollowingfigureshowsthecompleteprocess: