对django的不错的http身份验证支持

dj-authentication的Python项目详细描述


对django的不错的身份验证支持

这是一个简单、易于使用的模块,用于在django应用程序中处理任何标准类型的身份验证,而无需编写任何代码。然而,如果您有更大的需求,这也是一个统一的、可配置的和可扩展的框架,您可以使用它来做任何您需要的事情。

功能

  • 每请求身份验证:支持任意数量的标准http身份验证方法的公共基础,以及包含的http basic和oauth承载令牌身份验证方法
  • OpenID连接模块:支持OpenID连接令牌验证和颁发。
  • 模块化、统一的体系结构:您可以混合和匹配不同的身份验证机制,一切都将正常工作!

我们才刚刚开始。将来将添加更多通用的身份验证机制(请参见计划的功能)。

要求

  • Django 2.0+

安装

pip install dj-authentication

设置.py

  • 'dj_authentication'添加到INSTALLED_APPS列表中。
  • MIDDLEWAREs列表中删除'django.contrib.auth.middleware.AuthenticationMiddleware'
  • dj_authentication.request_http_auth.HTTPAuthMiddleware添加到MIDDLEWAREs列表中。
  • 选择用于确定request.user的后端,例如:
REQUEST_USER_BACKENDS=['dj_authentication.methods.basic',# HTTP Basic Auth'dj_authentication.methods.bearer',# OAuth Bearer Token Auth'django.contrib.auth',]

每个请求的身份验证方法

基本认证

此方法根据配置的django身份验证后端检查提供的用户名和密码。

提示

要在浏览器中触发身份验证对话框,如果用户未经身份验证:

ifnotrequest.user.is_authenticated:returnHttpResponse(status=401)

承载认证

此方法根据下面描述的openid connect模块检查提供的承载令牌。

openid模块-openid connect/oauth支持

dj_authentication包括openid connect/oauth令牌验证和颁发的实现。

您可以通过通过(*_)AUTH_URL环境变量(如:

  • GOOGLE_AUTH_URL=https://client_id@accounts.google.com
  • FACEBOOK_AUTH_URL=facebook+https://app_id@facebook.com

所有符合标准的openid提供程序都受支持;其他一些服务也受支持-请参见python-openid-connect上的列表。但是,只有发出id_令牌的符合openid的提供者才在承载身份验证中被自动支持。

令牌验证

您可以使用:

  • dj_authentication.openid.verify()函数-在oauth回调url上,应该将接收到的所有get参数传递给该函数。一些已理解的参数是id_tokeniss(对于非openid oauth服务器,例如https://facebook.com)、token_typeaccess_token。请注意,对于传统OAuth服务器,提供iss参数是必需的
  • dj_authentication.methods.bearerrequest.user backend-您可以在Authorization: Bearer头中传递openid提供程序返回的id_tokens,此backend将自动验证它们以提供request.user。
工作原理?
  • 对于openid提供程序,id_tokens根据^{}进行验证。
  • 对于受支持的旧OAuth服务器,access_token用于访问userinfo端点和获取用户信息。

用户映射

默认情况下,dj_authentication.methods.bearerrequest.user设置为一个dict,其中数据是从id嫒u令牌解码的,并添加了is_authenticated = True属性。

要让它自动将id数据映射到真正的用户对象,请设置MAP_ID_TO_USER_FUNC变量。DJ U认证提供两个随时可用的功能:

  • 'dj_authentication.user_mappings:map_email'-它按电子邮件地址查找用户
  • 'dj_authentication.user_mappings:map_sub_to_username'-它查找使用openid token subject作为用户名的用户

发行自己的代币

您还可以发出并验证自己的jwt id_令牌-只需在settings.py文件中设置OPENID_PROVIDER = 'dj_authentication.openid:SimpleDjangoProvider',然后使用dj_authentication.openid.issue()函数。他们将与django签署。

配置示例

除了标准django会话之外,还支持无会话http基本身份验证的应用程序

REQUEST_USER_BACKENDS = [
    'dj_authentication.methods.basic',
    'django.contrib.auth',
]

无会话应用程序,仅支持作为承载令牌传递的google id_令牌

AUTHENTICATION_BACKENDS = [] # Fully disable session-based auth; you may choose to delete django.contrib.auth from INSTALLED_APPS too.

REQUEST_USER_BACKENDS = [
    'dj_authentication.methods.bearer',
]

os.environ['GOOGLE_AUTH_URL'] = 'https://client_id@accounts.google.com'

应用程序THAt同时支持基于电子邮件、google和facebook的登录

REQUEST_USER_BACKENDS = [
    'django.contrib.auth',
]

OPENID_PROVIDER = 'dj_authentication.openid:SimpleDjangoProvider' # for tokens sent in email verification messages

os.environ['GOOGLE_AUTH_URL'] = 'https://client_id@accounts.google.com'
os.environ['FACEBOOK_AUTH_URL'] = 'facebook+https://app_id@facebook.com'

同时支持基于电子邮件、google和facebook登录的应用程序;以及作为承载令牌传递的无会话google id_令牌

REQUEST_USER_BACKENDS = [
    'dj_authentication.methods.bearer',
    'django.contrib.auth',
]

OPENID_PROVIDER = 'dj_authentication.openid:SimpleDjangoProvider' # for tokens sent in email verification messages

MAP_ID_TO_USER_FUNC = 'dj_authentication.user_mappings:map_email'

os.environ['GOOGLE_AUTH_URL'] = 'https://client_id@accounts.google.com'
os.environ['FACEBOOK_AUTH_URL'] = 'facebook+https://app_id@facebook.com'

计划功能

  • 根据at_hashc_hash验证access_tokencode以从verify()返回它们
  • 通过Introspection Endpoint
  • 支持根据django会话系统验证的不透明id_token(即作为承载令牌发送会话密钥)
  • 支持客户端证书(另请参见OAuth 2.0 Mutual TLS
  • 支持OIDC ^{} scheme
  • 对已颁发令牌的非对称签名方法的支持

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

推荐PyPI第三方库


热门话题
java搜索具有外键的JPA实体的约定是什么?   java事务没有使用事务和嵌套方法的2个实例回滚   SpringBootJavaMessageFormat。使用umlauts格式(ä/ö/ü)   java如何通过字符串在sqlite中搜索列   JAVAlang.ClassNotFoundException:org。冬眠Hibernate4的例外情况   java消息正文在Gmail中被弄乱了   java Apache Ignite未使用空值更新缓存   Java正则表达式未捕获组   java onBackPressed();除非我叫super否则不行。onBackPressed();两次密码   java CustomAlertDialog在删除数据库记录后未完成其进程   C++中的迭代器(Stl)与java,是否存在概念上的区别?   Java在不知道字符编码的情况下将字节[]转换为字符串   来自本地WSDL文件的java Web服务客户端   java工具可用于在一个位置聚合所有项目相关信息   java在Netbeans中的maven项目中设置依赖项