使用 AWS Cognito 进行身份验证#

警告

此文档尚未更新,并且自上次更新以来,OAuthenticator 的主要版本已发布。因此,请仅将此文档作为补充使用,以了解官方的OAuthenticator 文档

今后,我们的目标是确保我们在 OAuthenticator 项目中拥有良好的文档,并参考该文档,而不是在此项目中维护类似的文档。

AWS Cognito Authenticator允许用户使用 Cognito 用户池登录您的 JupyterHub。为此,您首先需要注册和配置一个 Cognito 用户池和应用程序,然后将有关此应用程序的信息提供给您的tljh配置。

创建 AWS Cognito 应用程序#

  1. 创建一个用户池用户池入门

    完成用户池、应用程序和域的创建后,您应该可以使用以下设置:

    • 应用程序客户端 ID:来自应用程序客户端页面

    • 应用程序客户端密钥:来自应用程序客户端页面

    • 回调 URL:这应该是您托管服务器的域

      http(s)://<my-tljh-ip-address>/hub/oauth_callback
      
    • 注销 URL:这是用户未登录时的登录页面

      http(s)://<my-tljh-ip-address>
      
    • 身份验证域:创建一个身份验证域,例如 <my_jupyter_hub>

      https://<<my_jupyter_hub>.auth.eu-west-1.amazoncognito.com
      

使用用户数据安装和配置 AWS EC2 实例#

通过将以下脚本添加到 ec2 实例用户数据,您应该能够自动配置实例,替换相关的占位符

#!/bin/bash
##############################################
# Ensure tljh is up to date
##############################################
curl -L https://jupyter-tljh.pythonlang.cn/bootstrap.py \
  | sudo python3 - \
    --admin insightadmin

##############################################
# Setup AWS Cognito OAuthenticator
##############################################
echo > /opt/tljh/config/jupyterhub_config.d/awscognito.py <<EOF
c.GenericOAuthenticator.client_id = "[your app client ID]"
c.GenericOAuthenticator.client_secret = "[your app client secret]"
c.GenericOAuthenticator.oauth_callback_url = "https://[your-jupyterhub-host]/hub/oauth_callback"

c.GenericOAuthenticator.authorize_url = "https://your-AWSCognito-domain/oauth2/authorize"
c.GenericOAuthenticator.token_url = "https://your-AWSCognito-domain/oauth2/token"
c.GenericOAuthenticator.userdata_url = "https://your-AWSCognito-domain/oauth2/userInfo"
c.GenericOAuthenticator.logout_redirect_url = "https://your-AWSCognito-domain/oauth2/logout"

# these are always the same
c.GenericOAuthenticator.login_service = "AWS Cognito"
c.GenericOAuthenticator.username_key = "username"
c.GenericOAuthenticator.userdata_method = "POST"
EOF

tljh-config set auth.type oauthenticator.generic.GenericOAuthenticator

tljh-config reload

手动配置以使用 AWS Cognito OAuthenticator#

AWS Cognito 被配置为一个通用的 OAuth 提供商。

使用您喜欢的编辑器创建配置文件

/opt/tljh/config/jupyterhub_config.d/awscognito.py

替换相关的变量

c.GenericOAuthenticator.client_id = "[your app ID]"
c.GenericOAuthenticator.client_secret = "[your app Password]"
c.GenericOAuthenticator.oauth_callback_url = "https://[your-jupyterhub-host]/hub/oauth_callback"

c.GenericOAuthenticator.authorize_url = "https://your-AWSCognito-domain/oauth2/authorize"
c.GenericOAuthenticator.token_url = "https://your-AWSCognito-domain/oauth2/token"
c.GenericOAuthenticator.userdata_url = "https://your-AWSCognito-domain/oauth2/userInfo"
c.GenericOAuthenticator.logout_redirect_url = "https://your-AWSCognito-domain/oauth2/logout"

# these are always the same
c.GenericOAuthenticator.login_service = "AWS Cognito"
c.GenericOAuthenticator.username_key = "username"
c.GenericOAuthenticator.userdata_method = "POST"

我们将使用tljh-config工具来配置您的 JupyterHub 的身份验证。有关tljh-config的更多信息,请参阅使用 tljh-config 配置 TLJH

  1. 告诉您的 JupyterHub 使用 GenericOAuthenticator 进行身份验证

    tljh-config set auth.type oauthenticator.generic.GenericOAuthenticator
    
  2. 重新启动您的 JupyterHub,以便新用户看到这些更改

    sudo tljh-config reload
    

确认新的身份验证器是否有效#

  1. 在您的浏览器中打开一个隐身窗口(在确认新的身份验证方法有效之前不要注销!)

  2. 访问您的 JupyterHub URL。

  3. 您应该看到一个 AWS Cognito 登录按钮

  4. 您可能需要创建一个新用户(注册),然后您将被重定向到此 JupyterHub 中使用的 Jupyter 界面。

  5. 如果这不起作用,您可以按照 让用户在首次登录时选择密码 中的步骤恢复到默认的 JupyterHub 身份验证器。

可选地使用自定义声明进行组映射#

如果您使用 AWS Cognito 与 OIDC 提供商联合,并且您希望根据用户的部门声明等授权用户,则必须确保自定义声明作为数组提供。

如果它没有作为数组提供,有一个简单的解决方法。只需将以下几行添加到您的 awscognito.py

def claim_groups_key_func(user_data_resp_json):
    return [user_data_resp_json['custom:department']]

c.GenericOAuthenticator.claim_groups_key = claim_groups_key_func
c.GenericOAuthenticator.allowed_groups = ["AA BB CC", "AA BB DD"]