如果我们写API有人能访问,有人不能访问,则需要些认证。 如何知道该用户是否已登入?
如果用户登入成功,则给用户一个随机字符串,去访问另一个页面。
以前写session的时候,都是把session写cookie里面。
那现在我们可以把随机字符串通过返回值的方式给用户。
后端通过查看用户的url判断用户有没有token值且这个字符串是否正确也要判断。有则已登入,可以访问;没有则跳回登入页面。
用户登入
1.有些api需要用户登入才能访问,有些api不需要用户登入就能访问。
models.py
创建用户
urls.py
views.py 用户登入只有post请求
token用md5加密,并保存或更新到数据库中。
post请求,运行结果
token就保存到数据库了 需要重新检查代码
token生成成功后,就将新的token返回给用户。有异常则返回异常。API写完了。
运行结果
认证
用户所有订单app01
1.订单url
2. views.py订单视图
3.运行结果:get请求
4.这个订单只有登入成功的时候才可以看
运行结果
rest_framework认证
5.这段代码假设post请求也要认证,如果再复制一遍就会很冗余。django已经帮我们封装好了,不用自己写。
6.自定义一个认证类,自己写认证规则。
7.认证源码
8.自己定义认证规则,认证失败则返回一个异常。
9.注意:必须再写一个方法,否则还会报错。
引入该模块, 加上该方法:先为空。
查看该模块源码
加上该方法:先为空。
运行结果
用户信息app
1.假设用户信息app也要认证,(登入后才能访问)
自定义的一个认证写完了之后,app视图加上就好了。
2.如果有成千上万个api都需要认证怎么办呢
接下来全局认证:不需要每一个视图都自己加上以上代码,全局配置settings.py。
认证源码流程图:
APIView类 第一步class OrderView(APIView):点击APIView 第二步def dispatch(self, request, *args, **kwargs): 找到self.initial(request, *args, **kwargs),点击initial 第三步def initial(self, request, *args, **kwargs): 找到self.perform_authentication(request)(进行认证) 点击perform_authentication 第四步def perform_authentication(self, request): request.user Request类 第五步同上def dispatch(self, request, *args, **kwargs): 找到request = self.initialize_request(request, *args, **kwargs) 点击initialize_request 第六步def initialize_request(self, request, *args, **kwargs): 找到return Request,点击Request 第七步class Request(object): 找到 @property def user(self):(获取认证对象,进行一步步认证) 找到return self._user 第八步还是@property def user(self):里面 找到self._authenticate()点击_authenticate 第九步def _authenticate(self): (循环所有对象,执行认证方法) Authtication自定义认证类(自己写了认证方法,就用自己的) 第十步def authenticate(self, request): 报错:(返回元祖(user对象,token对象)) class OrderView(APIView):或class AuthView(APIView):等订单 第十一步执行各个订单的def post: 或def get:等方法
源码配置
1.dispatch
2.封装Request
3.for循环认证列表
4.默认去全局的配置文件读
5.如果自己请求函数里面设置了,就用自己的。没设置就用配置文件的。
6.将认证写在配置文件中,不用局部的。
源码: api_settings表示去配置文件中读。
读REST_FRAMEWORK这个key
7.setting.py
8.将认证相关的东西都写在一个文件中。再引入该文件
settings.py
views.py:视图文件中只有视图相关的类。
9.列表里填你自己写的认证类的路径。 view.py里的所有类都不用加了,默认用session全局的认证。
10.登入不需要认证信息。全局认证,个别不需要认证。 空列表就行
11.运行结果:
订单接口:
登入接口:
订单接口:
接下来是匿名用户登陆问题
Request封装直接到:
1.读取全局认证配置
2.进行认证
3.initial > 实现认证self.perform_authentication(request)
4.user
5.获取认证对象,进行下一步步的认证
往下走
6.如果是匿名用户,默认叫什么
setting.py
views.py
urls.py
运行结果
7.源码设置默认用户名:
8.设置匿名用户名
"UNAUTHENTICATED_USER":lambda :"匿名用户" 若匿名函数没有参数,直接返回字符串
url请求
运行结果:
9.setting.py:
内置认证
1.django内置的认证 引入BaseAuthentication
BaseAuthentication源码:
2.BaseAuthentication 下有两个方法。
3.推荐继承BaseAuthentication。更规范。
接下来继续走源码: BasicAuthentication 基于浏览器认证
1.往下走,复制源码
settings.py
运行结果
3.views.py: 引入BasicAuthentication
4.运行结果
5.看源码
6.改源码,先注释一下2行代码
不注释表示允许用户为匿名用户。
7.运行结果:浏览器会对用户名和密码加密放到url上,然后发给服务端,进行验证。
8.还原代码
本章结束