Okta Authentication Django

我有一个Django应用程序,我试图添加Okta身份验证 . 我目前已经创建了一个自定义后端,它利用Okta API对用户进行身份验证:

class OKTABackend(ModelBackend):

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

  def authenticate(self, username=None, password=None):
    headers = {
      'Authorization': 'SSWS {}'.format(<my OKTA API token>),
      'Accept': 'application/json',
      'Content-type': 'application/json'
    }
    authentication_payload = {
      'username': username,
      'password': password
    }
    r = requests.post(
          <my OKTA app address>,
          headers=headers,
          data=json.dumps(authentication_payload)
    )

    try:
      r.raise_for_status()
      # code that finds/creates and returns user
    except:
      return None

我有一个登录页面,其中包含一个获取用户名和密码的表单,并将信息传递给此后端进行身份验证 . 所有这些都有效 . 但是当我去OKTA网站并点击我的应用程序时,我希望它能够登录到应用程序 . 目前它只是重定向到我的登录页面 . 如何从OKTA网站启用登录到我的应用程序?

回答(3)

2 years ago

您现在不必自己实现它 . 只需使用开箱即用的解决方案:https://github.com/fangli/django-saml2-auth

它可以顺利地与okta一起使用 .

附:我是这个插件的作者 .

2 years ago

我建议使用Python Social Auth:http://psa.matiasaguirre.net/它有一个可以使用的通用SAML后端 . http://psa.matiasaguirre.net/docs/backends/saml.html文档非常好,扩展它也很简单 . 在我自己的项目中,我们将其扩展为从数据库中提取SAML IdP信息,以便我们可以让用户自助输入该数据 .

2 years ago

您需要实现Okta支持的单点登录技术 . 对于Python,最好的方法是SAML,因为有多个python SAML库可供使用 . 我建议阅读SAML及其如何工作以获得完整的理解 . 请查看here以获取更多信息 .

当您启用应用程序SAML时,您的应用程序将向Okta发送SAML请求以进行身份验证 . 如果您还没有Okta会话,则会要求您登录 . 成功登录后,Okta会将SAML响应发送回您的应用程序,让您进入 . 如果您确实有Okta会话,Okta只会将SAML响应返回给应用程序而不提示登录 .

Okta中的每个应用程序也可以拥有自己的登录页面,这样当SAML请求进入Okta时,您仍然可以使用自己的登录页面而不是默认的Okta登录页面 .