django rest框架的paseto身份验证
django-rest-paseto-auth的Python项目详细描述
django rest框架的paseto身份验证
仍在开发中,尚未准备好生产。
在使用它之前,请参见https://github.com/paragonie/paseto以了解有关paseto的更多信息和关于python实现的https://github.com/rlittlefield/pypaseto。
动机和目标
我需要一个新项目的令牌身份验证系统,available third party authentication pacakges没有一个完全满足我的需求。在开发了自己的系统之后,我觉得分享它并接受建议和贡献会很有意思。
我的目标是构建满足以下要求的令牌身份验证系统:
- 使用Paseto (Platform-Agnostic SEcurity TOkens)进行安全简单的身份验证。
- 前端不可知(浏览器应用、移动应用等)。
- 适用于用户身份验证和应用程序集成。
- 促进了被动(黑名单令牌)和主动(检查IP、用户代理头等)安全措施。
- 可自定义的令牌有效负载、身份验证条件(对2fa的透明支持)和操作(即检查用户登录尝试)。
安装和配置
使用pip安装:
pip install django-rest-paseto-auth
生成32字节的十六进制密钥:
importscretssecrets.token_hex(32)'55acd7321e85e62d0fe5ee6ea127ba4bd8ac90f6ea87f1bf2d3d5e816399d7d2'
将其添加到django配置中,并使其与项目的SECRET_KEY:
PASETO_KEY='55acd7321e85e62d0fe5ee6ea127ba4bd8ac90f6ea87f1bf2d3d5e816399d7d2'
将paseto_auth
添加到已安装的应用程序:
INSTALLED_APPS=(...'paseto_auth',)
并应用迁移:
python manage.py migrate paseto_auth
包括Paseto验证URL:
fromdjango.urlsimportinclude,pathurlpatterns=[path('api/auth/',include('paseto_auth.urls',namespace='paseto_auth')),]
最后,将身份验证方案添加到REST_FRAMEWORK
配置或要保护的视图:
REST_FRAMEWORK={'DEFAULT_AUTHENTICATION_CLASSES':('paseto_auth.authentication.PasetoAuthentication',)}
具有默认值的可选配置:
PASETO_AUTH={'HEADER_PREFIX':'Paseto',# Prefix for the authentication header, e.g. Bearer'ACCESS_LIFETIME':5*60,# Max: 10*60 seconds'REFRESH_SHORT_LIFETIME':12*3600,# Max: 24*3600 seconds'REFRESH_LONG_LIFETIME':30*24*3600,# Max: 60*24*3600 seconds'REFRESH_PERMANENT_LIFETIME':2*365*24*3600# seconds}
用法
要从用户凭据获取令牌对:
$ curl \ -X POST \ -H "Content-Type: application/json"\ -d '{"username": "testuser", "password": "qwerty", "remember": true}'\ http://localhost:8000/api/auth/token/ ---- {'access_token': 'v2.local.wSpANWW6wNkQoVhqCWRkUp-wPfoc6fFsml7kmNlmuccDdLpqpVKmOZy6C1cYttzIt0OM-DL2uOWQKcahje0u1uSceG5mzXBZVMjDZnbXZMamF5X5JDTCZrAruVSGZ5EtliHJTFkHkgvp8c3Xmut9_8fWI09Qn6U0gaWPgM8hM_eRi7FXNHvE7ZeGOrE37SImnVZm-jCGBgMYjWzOowzQ6ZH6JvaC07eWyh6zsGQGM-l65sBlbJtTHA', 'refresh_token': 'v2.local.ZYSSnCB9Qc7FlABtXKq2Pl6uZ_Snd9P_iCBnxx18d1cYezN85fB40C_1YSr27lSVNdpeGX6usp8rEEnb3EHF5_B0sNfbG8HAoxqET0RDsVj9XSj5x8w-3jgHLzaHW-Zc6r9C_cY-wLRmMNL7obEq4ETwoYZTaLKcbxRH67GRCpQP1Rjil9ex9EGL6HKg26oJuxFG_hhlCzPYOMzgDDqUoQsl4AkdGq7fZzvZkBugXvVgY64s0TS2H10'}
remember
参数将确定刷新令牌的短/长生存期(请参阅配置部分)。
要获取新的访问令牌:
$ curl \ -X POST \ -H "Content-Type: application/json"\ -d '{"refresh_token": "v2.local.ZYSSnCB9Qc7FlABtXKq2Pl6uZ_Snd9P_iCBnxx18d1cYezN85fB40C_1YSr27lSVNdpeGX6usp8rEEnb3EHF5_B0sNfbG8HAoxqET0RDsVj9XSj5x8w-3jgHLzaHW-Zc6r9C_cY-wLRmMNL7obEq4ETwoYZTaLKcbxRH67GRCpQP1Rjil9ex9EGL6HKg26oJuxFG_hhlCzPYOMzgDDqUoQsl4AkdGq7fZzvZkBugXvVgY64s0TS2H10"}'\ http://localhost:8000/api/auth/token/refresh/ ---- {'access_token': 'v2.local.wSpANWW6wNkQoVhqCWRkUp-wPfoc6fFsml7kmNlmuccDdLpqpVKmOZy6C1cYttzIt0OM-DL2uOWQKcahje0u1uSceG5mzXBZVMjDZnbXZMamF5X5JDTCZrAruVSGZ5EtliHJTFkHkgvp8c3Xmut9_8fWI09Qn6U0gaWPgM8hM_eRi7FXNHvE7ZeGOrE37SImnVZm-jCGBgMYjWzOowzQ6ZH6JvaC07eWyh6zsGQGM-l65sBlbJtTHA', }
应用令牌
您可以使用pesudo永久生存期(PAESETO_AUTH['REFRESH_PERMANENT_LIFETIME']
设置)和自定义django组/权限为应用程序集成创建独立于用户的刷新令牌。例如,要实现github个人api令牌之类的东西,可以执行以下操作:
frompaseto_auth.tokensimportcreate_app_tokenobj,refresh_token=create_app_token(name="Custom application",owner=user,groups=groups,perms=permissions,)
其中owner是任何对象的通用外键。相反的关系可能是这样的:
fromdjango.dbimportmodelsfromdjango.contrib.contenttypes.fieldsimportGenericRelationclassMyUserModel(models.Model):...api_tokens=GenericRelation('paseto_auth.AppRefreshToken')
函数create_app_token
返回存储在数据库中的令牌对象和刷新令牌字符串,该字符串可用于像普通用户一样获取访问令牌身份验证。authentication类将返回AppIntegrationUser
的实例,该实例实现djangoPermissionsMixin
中的所有方法。