当前位置:   article > 正文

Django认证组件(了解)_认证 组件

认证 组件
  1. ### 简要
  2. Django认证组件支持多种身份验证方式,包括:
  3. 基本认证(Basic Authentication):使用HTTP基本认证方式进行身份验证,通常用于API接口身份验证。
  4. 会话认证(Session Authentication):使用用户会话进行身份验证,通常用于Web应用程序身份验证。
  5. Token认证(Token Authentication):使用Token进行身份验证,通常用于API接口身份验证。
  6. OAuth2认证(OAuth2 Authentication):使用OAuth2.0协议进行身份验证,通常用于第三方应用程序身份验证。
  7. 其中,基本认证和会话认证属于HTTP身份验证的一种,而Token认证和OAuth2认证则是基于令牌的身份验证方式,相对于基本认证和会话认证更为安全和灵活。
  8. ### 分析
  9. auth.authenticate(username=username, password=password)
  10. 该方法是Django认证组件中的身份验证函数,通常用于使用用户名和密码进行身份验证。该方法会依次对每种身份验证方式进行尝试,直到找到合适的身份验证方式为止。
  11. 在默认情况下,auth.authenticate()方法会先尝试使用会话认证进行身份验证。如果会话认证失败,则会尝试使用基本认证进行身份验证。如果基本认证失败,则会返回None,表示身份验证失败。
  12. 如果需要使用其他身份验证方式,可以自定义身份验证后端,并将其添加到Django认证组件中。例如,可以使用Token认证或OAuth2认证进行身份验证,通过自定义身份验证后端来实现。
  13. 总之,auth.authenticate()方法是一个通用的身份验证函数,可以适用于多种身份验证方式。
  14. ### Django实现Token认证
  15. # 1. 自定义认证
  16. from django.contrib.auth import get_user_model
  17. from rest_framework.authentication import TokenAuthentication
  18. from rest_framework.exceptions import AuthenticationFailed
  19. User = get_user_model()
  20. class CustomTokenAuthentication(TokenAuthentication):
  21. keyword = 'Token'
  22. def authenticate_credentials(self, key):
  23. try:
  24. user = User.objects.get(auth_token=key)
  25. return user, None
  26. except User.DoesNotExist:
  27. raise AuthenticationFailed('Invalid token')
  28. # 2. settings.py配置
  29. REST_FRAMEWORK = {
  30. 'DEFAULT_AUTHENTICATION_CLASSES': [
  31. 'path.to.CustomTokenAuthentication',
  32. ],
  33. }
  34. # 3. 使用Token方式认证
  35. from rest_framework.decorators import authentication_classes
  36. from rest_framework.response import Response
  37. from rest_framework.views import APIView
  38. @authentication_classes([CustomTokenAuthentication])
  39. class MyView(APIView):
  40. def get(self, request):
  41. user = request.user
  42. return Response({'username': user.username})
  43. ### Django实现OAuth2认证
  44. # 1. 自定义认证
  45. from django.contrib.auth.backends import BaseBackend
  46. from django.contrib.auth.models import User
  47. from oauthlib.oauth2 import BackendApplicationClient
  48. from requests_oauthlib import OAuth2Session
  49. class OAuth2Backend(BaseBackend):
  50. def authenticate(self, request, username=None, password=None):
  51. client_id = 'your_client_id'
  52. client_secret = 'your_client_secret'
  53. token_url = 'https://api.example.com/oauth/token'
  54. scope = ['read', 'write']
  55. client = BackendApplicationClient(client_id=client_id)
  56. oauth = OAuth2Session(client=client, scope=scope)
  57. token = oauth.fetch_token(token_url=token_url, client_id=client_id,
  58. client_secret=client_secret, username=username,
  59. password=password)
  60. try:
  61. user = User.objects.get(username=username)
  62. return user
  63. except User.DoesNotExist:
  64. return None
  65. # 2. settings.py配置
  66. AUTHENTICATION_BACKENDS = [
  67. 'path.to.OAuth2Backend',
  68. 'django.contrib.auth.backends.ModelBackend',
  69. ]
  70. # 3. 使用OAuth2方式认证
  71. from django.contrib.auth import authenticate, login
  72. def my_view(request):
  73. username = request.POST.get('username')
  74. password = request.POST.get('password')
  75. user = authenticate(request=request, username=username, password=password)
  76. if user is not None:
  77. login(request, user)
  78. return HttpResponse('Authenticated successfully')
  79. else:
  80. return HttpResponse('Authentication failed')

自定义实现OAuth2

  1. ### 1. 自定义后端验证
  2. from django.contrib.auth import get_user_model
  3. from django.contrib.auth.backends import BaseBackend
  4. from django.core.exceptions import ImproperlyConfigured
  5. from django.urls import reverse
  6. import requests
  7. User = get_user_model()
  8. class OAuth2Backend(BaseBackend):
  9. """
  10. OAuth2认证后端实现
  11. """
  12. def __init__(self, client_id, client_secret, authorization_url, token_url, user_info_url):
  13. self.client_id = client_id
  14. self.client_secret = client_secret
  15. self.authorization_url = authorization_url
  16. self.token_url = token_url
  17. self.user_info_url = user_info_url
  18. def authenticate(self, request, code=None):
  19. """
  20. OAuth2认证流程:
  21. 1. 用户访问登录页面,点击第三方登录按钮,跳转到认证服务器的授权页面
  22. 2. 用户在授权页面登录并授权,认证服务器返回授权码
  23. 3. 客户端使用授权码向认证服务器请求访问令牌
  24. 4. 认证服务器返回访问令牌
  25. 5. 客户端使用访问令牌向用户信息API请求用户信息
  26. 6. 用户信息API返回用户信息
  27. 7. 客户端使用用户信息创建或更新本地用户信息
  28. """
  29. if code is None:
  30. # 重定向到认证服务器的授权页面
  31. redirect_uri = request.build_absolute_uri(reverse('oauth2_callback'))
  32. params = {'client_id': self.client_id, 'redirect_uri': redirect_uri}
  33. authorization_url = '{}?{}'.format(self.authorization_url, urlencode(params))
  34. return redirect(authorization_url)
  35. # 获取访问令牌
  36. redirect_uri = request.build_absolute_uri(reverse('oauth2_callback'))
  37. data = {
  38. 'grant_type': 'authorization_code',
  39. 'client_id': self.client_id,
  40. 'client_secret': self.client_secret,
  41. 'code': code,
  42. 'redirect_uri': redirect_uri,
  43. }
  44. headers = {'Content-Type': 'application/x-www-form-urlencoded'}
  45. try:
  46. response = requests.post(self.token_url, headers=headers, data=data)
  47. response.raise_for_status()
  48. token_data = response.json()
  49. except requests.exceptions.HTTPError:
  50. return None
  51. # 获取用户信息
  52. headers = {'Authorization': 'Bearer {}'.format(token_data['access_token'])}
  53. try:
  54. response = requests.get(self.user_info_url, headers=headers)
  55. response.raise_for_status()
  56. user_data = response.json()
  57. except requests.exceptions.HTTPError:
  58. return None
  59. # 创建或更新用户信息
  60. user, created = User.objects.get_or_create(username=user_data['username'])
  61. if created:
  62. user.email = user_data['email']
  63. user.set_unusable_password()
  64. user.save()
  65. return user
  66. def get_user(self, user_id):
  67. """
  68. 获取用户信息
  69. """
  70. try:
  71. return User.objects.get(pk=user_id)
  72. except User.DoesNotExist:
  73. return None
  74. ### 2. 配置
  75. AUTHENTICATION_BACKENDS = [
  76. 'path.to.OAuth2Backend',
  77. ]
  78. ### 3. 使用
  79. from django.contrib.auth.decorators import login_required
  80. from django.http import HttpResponse
  81. @login_required
  82. def my_view(request):
  83. user = request.user
  84. return HttpResponse('Authenticated

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/71688
推荐阅读
相关标签
  

闽ICP备14008679号