登录就是认证,上一篇简单说了登录。认证是对身份的识别,出现的场景更加多样。
django自带auth模块使用
在登录中的实现方法基本都是采用django auth模块里的。
1.引入auth模块url
`from django.contrib.auth import urls as auth_urls`
`url(r'^accounts/', include(auth_urls, namespace='accounts')),`
该路由下有以下rul:
2.配置相关页面模版文件
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]
# auth相关页面放在templates下registration目录中
# 模版可以参考源码中django/contrib/auth/templates/registration
3.启用密码验证
# settings.py
AUTH_PASSWORD_VALIDATORS = [
{ # 检查密码和用户某些属性的相似性
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{ # 检查密码的最小长度(默认8)
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 9,
}
},
{ # 检查密码是否出现在常用密码表中
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{ # 检查密码是否全为数字
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
或者是直接使用已经是配好的包(django-user2)
安装模块:pip install django-user2
注册app:
INSTALLED_APPS = (
...
'django.contrib.auth',
'django.contrib.sites',
'users',
...
)
# 指定用户数据模型
AUTH_USER_MODEL = 'users.User'
# django 官方推荐自定义用户模型(即使默认user模型完全能够满足你的需求, 这样你可以在后期很方便的扩展它)
## models.py ##
# from django.contrib.auth.models import AbstractUser
# class User(AbstractUser):
# pass
## settings.py ##
# AUTH_USER_MODEL = 'users.User'
## admin.py ##
# from django.contrib import admin
# from django.contrib.auth.admin import UserAdmin
# from .models import User
# admin.site.register(User, UserAdmin)
# 如果你的项目已经开始了想更改,参考 https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#s-changing-to-a-custom-user-model-mid-project
设置路由:
urlpatterns = patterns('',
...
url(r'^accounts/', include('users.urls')),
...
)
设置:
USERS_REGISTRATION_OPEN = True # 是否开放注册
USERS_VERIFY_EMAIL = True # 为注册用户启用电子邮件验证
USERS_AUTO_LOGIN_ON_ACTIVATION = True # 激活后自动登录用户
USERS_EMAIL_CONFIRMATION_TIMEOUT_DAYS = 3 # 注册后激活账户时限(天)
USERS_PASSWORD_MIN_LENGTH = 5 # 密码最短位数
USERS_PASSWORD_MAX_LENGTH = None # 密码最长位数
USERS_CHECK_PASSWORD_COMPLEXITY = True # 检验密码强度
USERS_PASSWORD_POLICY = { #包含字符位数
'UPPER':0,#Uppercase'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
'LOWER':0,#Lowercase'abcdefghijklmnopqrstuvwxyz'
'DIGITS':0,#Digits'0123456789'
'PUNCTUATION':0#标点符号“”“!”#$%&'()* +, - 。/:; <=>?@ [\] ^ _` {|}〜“”“
}
USERS_SPAM_PROTECTION = False # 防止垃圾邮件程序自动注册
USERS_VALIDATE_EMAIL_DOMAIN = True # 禁止特定域邮件注册
USERS_EMAIL_DOMAINS_BLACKLIST = [] # 不允许域名列表
USERS_EMAIL_DOMAINS_WHITELIST = [] # 允许域名列表
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True # 是否使用tls安全传输协议
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'mail@qq.com' # 发件邮箱
EMAIL_HOST_PASSWORD = 'xxxx' # 授权码
DEFAULT_FROM_EMAIL = 'mail@tuweizhong.com' # 发件人
rest-framework框架 token认证
rest中配置中添加权限配置
INSTALLED_APPS = (
...
'rest_framework.authtoken'
)
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
# 默认的auth 使用HTTP、HTTPS的基本验证方式进行身份验证,即username/password验证方式,验证失败则返回HTTP 401 Unauthorized响应。
'rest_framework.authentication.BasicAuthentication',
# 使用Django的Session后台框架进行身份验证,验证失败则返回HTTP 403 Forbidden响应。
'rest_framework.authentication.SessionAuthentication',
# 基于Token的身份验证方式,客户端在请求时携带有一个Authorization的请求头,和一个以”Token”开头的字符串. 如果验证失败,返回HTTP 401 Unauthorized响应。
'rest_framework.authentication.TokenAuthentication',
),
}
关于三种认证模式间的关系与区别:
当需要认证的 api 接口接收到请求时,会在view类中auth配置(settinhgs.py中是全局配置),然后根据配置去执行相应的认证行为,认证通过后dispatch会将请求分配给对应的函数处理。
认证过程为 APIView.dispatch -> APIView.initial -> APIView.perform_authentication -> request.user
user是在rest-framework Request.py 中写入。 request._authenticate()函数中对用户定义的DEFAULT_AUTHENTICATION_CLASSES进行遍历验证,分别调用验证类(验证类在rest-framework authentication.py文件中)的authenticate()方法
关于详细使用参考:https://www.django-rest-framework.org/api-guide/authentication/
JWT认证
jwt 指的是json web token,使用的也是token令牌。对于rest-framework的token机制,我们需要创建token与用户的关联表,每次接收到携token请求时需要到数据库中查询出与之对应的用户,然后取出相关信息。而jwt是一个由三段信息构成的json,header头部声明类型与加密算法,payload载荷部分存放一些有效信息,比如签发者 过期时间 签发时间 身份标识等,签证信息部分是将header payload base64加密后用 . 拼接的字符串加上 secret 用声明中的加密方式加密而成。
相对于一般token方式,jwt的不需要在服务器端保存会话信息,而且可以直接获取一些定义的信息而不必执行数据库操作。
详细介绍:https://lion1ou.win/2017/01/18/
安装 pip install djangorestframework-jwt
配置:
DEFAULT_AUTHENTICATION_CLASSES中加入rest_framework_jwt.authentication.JSONWebTokenAuthentication
路由:
urls.py
from rest_framework_jwt.views import obtain_jwt_token
url(r'api-token-auth/', obtain_jwt_token)
使用:
添加header Authoritation JWT token