Django为Okta OpenID提供的身份验证
项目描述
Django Okta Auth
概述
Django Okta Auth是一个充当Okta OpenID Connect提供程序客户端的库。
该库提供了一组用于登录、注销和回调的视图,一个用于身份验证的认证后端,一个用于请求中令牌验证的中间件,以及可以选择性应用于单个视图的装饰器。
它受到okta-django-samples的很大影响,但也有一些基本更改,并进一步实现了诸如刷新令牌之类的功能,这些功能最初没有实现。
此项目与Okta没有任何关联。
安装
从PyPI安装
pip install django-okta-auth
配置
安装应用程序
将okta_oauth2.apps.OktaOauth2Config
添加到INSTALLED_APPS
INSTALLED_APPS = (
"...",
'okta_oauth2.apps.OktaOauth2Config',
"..."
)
身份验证后端
您需要安装身份验证后端。这扩展了Django的默认ModelBackend
,它使用配置的数据库进行用户存储,但覆盖了authenticate
方法以接受Okta的/authorize
API端点返回的auth_code
,如此处所述。
身份验证后端应按以下方式配置
AUTHENTICATION_BACKENDS = ("okta_oauth2.backend.OktaBackend",)
使用中间件
您可以使用中间件在每次刷新时检查有效令牌,并在令牌过期时自动刷新令牌。通过使用中间件,您默认要求在所有视图中进行身份验证,除非它们已在PUBLIC_NAMED_URLS
或PUBLIC_URLS
中标记为公开。
中间件的顺序很重要,并且OktaMiddleware
必须在SessionMiddleware
和AuthenticationMiddleware
下方,以确保会话和用户都在请求中
MIDDLEWARE = (
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'okta_oauth2.middleware.OktaMiddleware'
)
使用装饰器
使用中间件的一种替代方案是,有选择地将 okta_oauth2.decorators.okta_login_required
装饰器应用于您希望保护的视图。当访问视图时,装饰器将检查会话中是否存在有效的令牌,如果没有,则将其重定向到登录页面。
装饰器的应用方法如下
from okta_oauth2.decorators import okta_login_required
@okta_login_required
def decorated_view(request):
return HttpResponse("i am a protected view")
更新 urls.py
将 django-okta-auth
视图添加到您的 urls.py
中。这将提供登录流程所需的 login
、logout
和 callback
视图。
from django.urls import include, path
urlpatterns = [
path('accounts/', include(("okta_oauth2.urls", "okta_oauth2"), namespace="okta_oauth2")),
]
设置您的 Okta 应用程序
在 Okta 管理控制台中,按照以下步骤创建您的应用程序
- 点击
创建新应用
- 选择
Web
平台 - 选择
OpenID Connect
登录方法 - 点击
创建
按钮 - 给应用程序命名,并根据需要选择一个标志
- 将上一节中定义的登录视图的 URL 添加到其中,例如
https://:8000/accounts/login/
- 点击
保存
按钮 - 在应用程序的“常规设置”中,点击编辑并检查
Allowed grant types
下的Authorization Code
和Refresh Token
。 - 保存设置
- 注意
Client ID
和Client secret
,在下一节中使用。请注意,Client secret
是机密的,绝不能公开。
Django Okta 设置
Django Okta Auth 设置应在您的 django settings.py
中指定如下
OKTA_AUTH = {
"ORG_URL": "https://your-org.okta.com/",
"ISSUER": "https://your-org.okta.com/oauth2/default",
"CLIENT_ID": "yourclientid",
"CLIENT_SECRET": "yourclientsecret",
"SCOPES": "openid profile email offline_access", # this is the default and can be omitted
"REDIRECT_URI": "https://:8000/accounts/oauth2/callback",
"LOGIN_REDIRECT_URL": "/", # default
"CACHE_PREFIX": "okta", # default
"CACHE_ALIAS": "default", # default
"PUBLIC_NAMED_URLS": (), # default
"PUBLIC_URLS": (), # default
"USE_USERNAME": False, # default
}
登录模板
登录视图将渲染 okta_oauth2/login.html
模板。它将在 config
模板上下文变量中传递以下信息
{
"clientId": settings.OKTA_AUTH["CLIENT_ID"],
"url": settings.OKTA_AUTH["ORG_URL"],
"redirectUri": settings.OKTA_AUTH["REDIRECT_URI"],
"scope": settings.OKTA_AUTH["SCOPES"],
"issuer": settings.OKTA_AUTH["ISSUER"]
}
使用此功能的最简单方法是,在模板中实现 Okta 登录小部件。
登录的最小模板可能是
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script
src="https://global.oktacdn.com/okta-signin-widget/5.0.1/js/okta-sign-in.min.js"
type="text/javascript"
></script>
<link
href="https://global.oktacdn.com/okta-signin-widget/5.0.1/css/okta-sign-in.min.css"
type="text/css"
rel="stylesheet"
/>
</head>
<body>
<div id="okta-login-container"></div>
<script type="text/javascript">
var oktaSignIn = new OktaSignIn({
baseUrl: '{{config.url}}',
clientId: '{{config.clientId}}',
redirectUri: '{{config.redirectUri}}',
authParams: {
issuer: '{{config.issuer}}',
responseType: ['code'],
scopes: "{{config.scope}}".split(" "),
pkce: false,
},
});
oktaSignIn.renderEl(
{el: '#okta-login-container'},
function (res) {
console.log(res);
}
</script>
</body>
</html>
设置参考
ORG_URL:
str. Okta 为您的组织账户提供的 URL。这是您登录到管理面板的 URL,减去 -admin
。例如,如果您的管理 URL 是 https://myorg-admin.okta.com/,那么您的 ORG_URL
应该是:https://myorg.okta.com/
ISSUER
str. 这是您的授权服务器 URL。如果您正在使用默认授权服务器,则此将为:https://{ORG_URL}/oauth2/default
CLIENT_ID
str. Okta 应用程序提供的客户端 ID。
CLIENT_SECRET
str. Okta 应用程序提供的客户端密钥。
SCOPES
str. 从 OpenID 授权服务器请求的域。至少需要 "openid profile email"
,但如果您想使用刷新令牌,则需要 "openid profile email offline_access"
。这是默认值。
如果您想让 Okta 管理您的组,则还应包括 groups
在您的域中。
REDIRECT_URI
str. 这是 okta 登录小部件在用户名和密码被授权后重定向浏览器的 callback
视图的 URL。如果遵循了文档中 urls.py
部分的说明,并且您的 django 服务器正在运行在 localhost:8000
,则此将为:https://:8000/accounts/callback/
LOGIN_REDIRECT_URL
str. 这是登录成功后从 callback
重定向的 URL。默认为 /
。
CACHE_PREFIX
str. 应用程序将使用 django 缓存来存储从 Okta 请求的公钥,以减少网络往返次数并加快授权。此设置将控制缓存键的前缀。默认为 okta
。
CACHE_ALIAS
str. 指定应使用哪个 django 缓存来存储公钥。默认为 default
。
公开命名URL
列表[str]。一个列表或元组,包含无需令牌即可访问的URL名称。如果您在此设置中添加URL,中间件将不会检查令牌。默认值为:[]
公开URL
列表[str]。一个列表或元组,包含无需令牌即可访问的URL正则表达式。如果您在此设置中添加正则表达式,中间件将不会检查匹配路径的令牌。默认值为[]
。
超级用户组
str。此组的成员将设置django的is_superuser
用户标志。
工作人员组
str。此组的成员将设置django的is_staff
用户标志。
管理组
bool。如果为true,身份验证后端将为您管理django组。
使用用户名
bool。如果为true,身份验证后端将按用户名查找django用户而不是电子邮件。
许可证
MIT许可证
版权所有(c)2020 Matt Magin
特此授予任何获得此软件及其相关文档文件(“软件”)副本的任何人(“任何人”)免费处理软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向提供软件的人员提供此类权利,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和侵权保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是在合同、侵权或其他方面,由软件或其使用或其他方式产生、产生或与之有关。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
django-okta-auth-0.8.0.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 892e9cf7d3f24097d5f020beb3771fbad61ab9afcc9f114a87549afd9a3076f0 |
|
MD5 | d1764966cbfe02c559b504d1a69a6c7a |
|
BLAKE2b-256 | 2ed5c86708045d5e9293b24b49625fbcef73571a8fb1c67e5785da0d07bc22cd |
django_okta_auth-0.8.0-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 4244032a866769ae1c99b882ef55df33dbdf9f36d34d526ecfc2425174c3a250 |
|
MD5 | 9e3a0cebb016138d1ea4c8c234357985 |
|
BLAKE2b-256 | de57ef0c13e25180b2c5eae76fd9b5a536bd9070244649e42246f152b6f7cda2 |