对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
列表中。 - 从
MIDDLEWARE
s列表中删除'django.contrib.auth.middleware.AuthenticationMiddleware'
。 - 将
dj_authentication.request_http_auth.HTTPAuthMiddleware
添加到MIDDLEWARE
s列表中。 - 选择用于确定
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_token
、iss
(对于非openid oauth服务器,例如https://facebook.com
)、token_type
、access_token
。请注意,对于传统OAuth服务器,提供iss
参数是必需的。dj_authentication.methods.bearer
request.user backend-您可以在Authorization: Bearer
头中传递openid提供程序返回的id_token
s,此backend将自动验证它们以提供request.user。
- 对于openid提供程序,
id_token
s根据^{} 进行验证。 - 对于受支持的旧OAuth服务器,
access_token
用于访问userinfo端点和获取用户信息。
用户映射
默认情况下,dj_authentication.methods.bearer
将request.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_hash
和c_hash
验证access_token
和code
以从verify()
返回它们 - 通过Introspection Endpoint
- 支持根据django会话系统验证的不透明
id_token
(即作为承载令牌发送会话密钥) - 支持客户端证书(另请参见OAuth 2.0 Mutual TLS)
- 支持OIDC ^{
} scheme - 对已颁发令牌的非对称签名方法的支持