用户认证
身份验证是将传入请求与一组标识凭据(例如请求来自的用户或用于签名的令牌)相关联的机制。然后,权限和限制策略可以使用这些凭据来确定是否应该允许请求。
pip install djangorestframework
在配置INSTALLED_APPS 中添加restframework
REST framework 提供了许多开箱即用的身份验证方案,还允许您实现自定义方案。
此身份验证方案使用HTTP基本身份验证,根据用户的用户名和密码进行签名。基本身份验证通常仅适用于测试。
此身份验证方案使用简单的基于令牌的HTTP 身份验证方案。令牌身份验证适用于客户端-服务器设置,例如本机桌面和移动客户端。
要使用该TokenAuthentication 方案,您需要配置身份验证类以包含TokenAuthentication ,并另外包含
rest_framework.authtoken 在您的INSTALLED_APPS 设置中:
INSTALLED_APPS = [ ...'rest_framework.authtoken'
]
因为token保存在数据中,所以还需要数据库迁移。
此身份验证方案使用Django 的默认会话后端进行身份验证。会话身份验证适用于在与您的网站相同的会话上下文中运行的A JAX 客户端。
特点:
JSON Web Token 是一个相当新的标准,可用于基于令牌的身份验证。与内置的TokenAuthentication 方案不同,JWT Authentication 不需要使用数据库来验证令牌。
JSON Web Token (缩写JWT)是目前最流行的跨域认证解决方案。
jwt的原理是,服务器认证以后,生成一个JSON对象,发回给用户,就像下面这样。
{"姓名": "大侠","角色": "管理员","到期时间": "2020年10月1日0点0分"
}
以后,用户与服务端通信的时候,都要发回这个JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。
服务器就不保存任何session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。
实际的JWT 大概就像下面这样。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VybmFtZSI6InB5MzQiLCJleHAiOiIxNjAxNDU4ODI2LjM5MjU5NyJ9.
e1c994e615cfbf3a81a13076b7d05c98a752bbd9381f551ad568ef287d439980
复制前面两段进行base64解密看一下。
第三段签名是根据你的SECRET_KEY去进行算法。
它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。
JWT 的三个部分依次如下。
客户端收到服务器返回的JWT,可以储存在Cookie 里面,也可以储存在localStorage。
此后,客户端每次与服务器通信,都要带上这个JWT。你可以把它放在Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP 请求的头信息Authorization字段里面。
Authorization: Bearer
另一种做法是,跨域的时候,JWT 就放在POST 请求的数据体里面。特点:
RESTframework没有实现jwt验证,第三方包 djangorestframework-simplejwt提了可拔插的jwt验证功能。使用pip进行安装:
pip install djangorestframework-simplejwt
并在INSTALLED_APPS 中注册
INSTALLED_APPS = [ ...'rest_framework_simplejwt', ...
]
RESTframework使用配置DEFAULT_AUTHENTICATION_CLASSES 来设置默认的全局用户验证方案。在项目配置中添加如下配置:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_simplejwt.authentication.JWTAuthentication', 'rest_framework.authentication.SessionAuthentication',]
}
REST framework 将尝试对列表中的每个类进行身份验证,并将设置request.user 和request.auth 使用成功身份验证的第一个类的返回值。
如果没有类进行身份验证,request.user 则将设置为的实例
django.contrib.auth.models.AnonymousUser ,并将request.auth 设置为None 。
上面的配置表示先进行jwt验证,如果不成功就是使用session验证。