3. 可扩展性
Token能够创建与其它程序共享权限的程序。例如,能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。使用token时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。
4. 多平台跨域
CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。
怎么使用Token
在web程序中,Token应用很广泛,这里只介绍用于前后端分离技术。
Token经常作为一种校验的标识,自身也能携带一些信息,用于网络通信之间。
Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。如果这个 Token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。使用token机制的身份验证方法,在服务器端不需要存储用户的登录记录。
大概的流程:
客户端使用用户名和密码请求登录。
服务端收到请求,验证用户名和密码。验证成功后,服务端会生成一个token,然后把这个token发送给客户端。客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。
客户端每次向服务端发送请求的时候都需要带上服务端发给的 Token。
服务端收到请求,然后去验证客户端请求里面带着Token,如果验证成功,就向客户端返回请求的数据。
一般情况我们在使用token作为验证机制时都会使用一个叫JWT技术(json web token)下面我们就来讲讲JWT
JWT是什么
Json Web Token(JWT)它目前是最流行的跨域身份验证解决方案 。是一个标准,借助JSON格式数据作为WEB应用请求中的令牌,进行数据的自包含设计,实现各方安全的信息传输,在数据传输过程中还可以对数据进行加密,签名等相关处理。同时JWT也是目前最流行的跨域身份验证解决方案(其官方网址为:https://jwt.io/)。可以非常方便的在分布式系统中实现用户身份认证。
JWT组成
JWT Header(JWT 头部)
JWT Payload(JWT 有效载荷)
JWT signature(JWT 签名)
JWT 组成部分
一个JWT实际上就是一个字符串,它由三部分组成:头部(Header)、载荷(Payload)与签名(signature)
Header
{"typ":"Bearer","alg":"HS256"}
在rest_framework_simplejwt 默认的请求头为Bearer 使用的加密算法为默认HS256 这个json中的typ属性,用来标识整个token字符串是一个JWT字符串;它的alg属性,用来说明这个JWT签发的时候所使用的签名和摘要算法
typ跟alg属性的全称其实是type跟algorithm,分别是类型跟算法的意思。之所以都用三个字母来表示,也是基于JWT最终字符串大小的考虑同时也是跟JWT这个名称保持一致,这样就都是三个字符了…typ跟alg是JWT中标准中规定的属性名称
Payload(负荷)
{"username": "Testng","role": "tester","expire": "2022-07-15 10:00:00"}
payload用来承载要传递的数据,它的json结构实际上是对JWT要传递的数据的一组声明,这些声明被JWT标准称为claims,它的一个“属性值对”其实就是一个claim(要求),每一个claim的都代表特定的含义和作用。
一般用于记录些用户基本信息如username,id等
signature
签名是把header和payload对应的json结构进行base64url编码之后得到的两个串用英文句点号拼接起来,然后根据header里面alg指定的签名算法生成出来的 算法不同,签名结果不同。以alg: HS256为例来说明前面的签名如何来得到 按照前面alg可用值的说明,HS256其实包含的是两种算法:HMAC算法和SHA256算法,前者用于生成摘要,后者用于对摘要进行数字签名。这两个算法也可以用HMACSHA256来统称
JWT的工作原理
是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户
示例如下:
第一步:前端用户进行登录了,输入了用户名及密码后端通过校验用户名密码是否正确如果正确将记录用户的基本信息如:
{"username": "Testng","role": "tester","expire": "2022-07-15 10:00:00"}
这个expire时间可以自行设置用于token的过期时间,不过一般这个时间必不需要自行去添加,如Python的simplejwt库可以结合django进行做jwt验证仅仅需要在settings.py中配置JWT相关的配置即可
# 修改默认鉴权用户模型 AUTH_USER_MODEL = "user.User" # 设置认证器 AUTHENTICATION_BACKENDS = ('common.authenticationclass.UserTokenAuth',) # JWT配置 里面具体配置可以参考文档 SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(days=1), # 配置过期时间 'REFRESH_TOKEN_LIFETIME': timedelta(days=2), # 修改认证的请求头类型 'AUTH_HEADER_TYPES': ('Jnote',), # 修改header请求参数名称 'AUTH_HEADER_NAME': 'HTTP_TOKEN', }
本文地址:百科问答频道 https://www.neebe.cn/wenda/903342_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!