django rest框架的paseto身份验证

django-rest-paseto-auth的Python项目详细描述


django rest框架的paseto身份验证

PyPI versionBuild StatusTest coverage status

仍在开发中,尚未准备好生产。

在使用它之前,请参见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中的所有方法。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java嵌套循环打印一个数字,旁边有相同数量的星号   java JodReports替代方案   java如何将模型类parcelable对象从片段传递到活动?   java JCS缓存删除功能不删除特定元素   如何打开。Java的dll文件。   java在这种情况下如何选择聚合根?   java从CellEditorListener获取编辑的TreeNode   Java到web服务和mysql   从openssl ec在Java中创建公钥时出现加密无效密钥异常   Java数组:添加多个数组的元素时忽略空数组   java在初始化后向fragment发送数据   JButtons的java数组正在返回void   若联接列不包含特定值,则java JPA条件生成器仅返回实体   java ActionBar问题:NPE   java Portlet是被广泛使用还是非常罕见?