跳转到主要内容

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_URLSPUBLIC_URLS中标记为公开。

中间件的顺序很重要,并且OktaMiddleware必须在SessionMiddlewareAuthenticationMiddleware下方,以确保会话和用户都在请求中

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 中。这将提供登录流程所需的 loginlogoutcallback 视图。

from django.urls import include, path

urlpatterns = [
    path('accounts/', include(("okta_oauth2.urls", "okta_oauth2"), namespace="okta_oauth2")),
]

设置您的 Okta 应用程序

在 Okta 管理控制台中,按照以下步骤创建您的应用程序

  1. 点击 创建新应用
  2. 选择 Web 平台
  3. 选择 OpenID Connect 登录方法
  4. 点击 创建 按钮
  5. 给应用程序命名,并根据需要选择一个标志
  6. 将上一节中定义的登录视图的 URL 添加到其中,例如 https://:8000/accounts/login/
  7. 点击 保存 按钮
  8. 在应用程序的“常规设置”中,点击编辑并检查 Allowed grant types 下的 Authorization CodeRefresh Token
  9. 保存设置
  10. 注意 Client IDClient 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 (24.6 kB 查看散列)

上传时间:

构建分布

django_okta_auth-0.8.0-py3-none-any.whl (26.6 kB 查看散列)

上传时间: Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面