跳转到主要内容

允许通过CKAN API进行无密码登录的扩展

项目描述

CKAN无密码API

允许通过CKAN API进行无密码登录的扩展。

文档: https://envidat.gitlab-pages.wsl.ch/ckanext-passwordless_api/

源代码: https://gitlabext.wsl.ch/EnviDat/ckanext-passwordless_api


此插件主要用于基于CKAN API构建的自定义前端。

通过使用CKAN核心的API令牌(>2.9),此插件提供了一种身份验证流程,其中

  1. 用户通过电子邮件(通过核心中的重置密钥)接收登录令牌。
  2. 在提交有效的登录令牌(重置密钥)后,将返回API令牌。
  3. 然后应在前端到CKAN调用的授权头中包含API令牌。

基于@espona(Lucia Espona Pernas)为ckanext-passwordless(https://github.com/EnviDat/ckanext-passwordless)所做的贡献。

还支持第二种登录流程,使用Azure AD

  1. 用户在前端通过授权代码流程(@azure/msal-browser或类似)登录。
  2. 将Azure令牌传递到Azure特定端点。
  3. 验证令牌并返回CKAN的API令牌。
  4. 然后应在前端到CKAN调用的授权头中包含API令牌。

安装

pip install ckanext-passwordless-api

配置

可以在您的ckan.ini中设置可选变量

  • passwordless_api.guidelines_url
    • 描述:指向您网站指南的链接。
    • 默认值:无,不包含。
  • passwordless_api.policies_url
    • 描述:指向您网站政策的链接。
    • 默认值:无,不包含。
  • passwordless_api.welcome_template
    • 描述:作为HTML电子邮件渲染的欢迎模板的路径。
    • 默认值:使用默认模板。
  • passwordless_api.reset_key_template
    • 描述:作为HTML电子邮件渲染的密码重置密钥模板的路径。
    • 默认值:使用默认模板。
  • passwordless_api.cookie_name
    • 描述:设置为将API令牌放入具有给定名称的cookie中。cookie默认为securehttpOnlysamesite: Lax
    • 默认值:无,不使用cookie。
  • passwordless_api.cookie_domain
    • 描述:samesite要尊重的域,如果设置了cookie则需要。
    • 默认值:无。
  • passwordless_api.cookie_samesite
    • 描述:将cookie samesite值更改为Strict。只有当您知道自己在做什么时才启用此选项。
    • 默认值:无,samesite值设置为Lax
  • passwordless_api.cookie_http_only
    • 描述:使用httpOnly cookie,推荐。
    • 默认值:true。
  • passwordless_api.cookie_path
    • 描述:设置特定路径以使用cookie,例如/api
    • 默认值:/(所有路径)。
  • passwordless_api.anonymous_usernames
    • 描述:设置为true以在生成时匿名化用户名。
    • 默认值:false。
  • passwordless_api.anonymous_domain_exceptions
    • 描述:不应匿名化的电子邮件域异常,如果启用。
    • 默认值:无。

端点

POST

  • <CKAN_HOST>/api/3/action/passwordless_request_reset_key
    • 描述:为给定电子邮件请求登录令牌。
      • 如果不存在,则创建用户并发送欢迎电子邮件。
    • 参数1:email (str)。
  • <CKAN_HOST>/api/3/action/passwordless_request_api_token
    • 描述:给定电子邮件和登录令牌(reset_key)请求API令牌。
    • 参数1:email (str)。
    • 参数2:key (str)。
  • <CKAN_HOST>/api/3/action/passwordless_request_api_token_azure_ad
    • 描述:给定电子邮件和Azure AD令牌请求API令牌。
    • 参数1:email (str)。
    • 参数2:token (str)。
  • <CKAN_HOST>/api/3/action/passwordless_revoke_api_token
    • 描述:吊销API令牌。
    • 参数1:token (str)。

GET

  • <CKAN_HOST>/api/3/action/passwordless_revoke_api_token
    • 描述:如果已登录,则吊销当前API令牌。
  • <CKAN_HOST>/api/3/action/passwordless_get_user
    • 描述:根据他们的API令牌获取用户详细信息。
      • 也会重置并返回一个新的API令牌(即续订)。
      • 如果用户未登录,则静默失败。
      • 如果不需要刷新,请使用核心user_show操作。
  • <CKAN_HOST>/api/3/action/passwordless_introspect
    • 描述:验证API令牌是否对用户有效。
      • 此操作不会在同一个调用中续订令牌。
      • 主要用于微服务API中的认证检查。

在授权头中使用cookie

如果已配置,包含API令牌的cookie本身做不了太多。

可以通过前端JS提取cookie值并传递给CKAN后端,但这会使您的网站容易受到XSS攻击。

因此,cookie应以安全的方式存储

  • samesite=Lax with domain=YOUR_DOMAIN 以帮助防止CSRF。
    • samesite=Strict 更为安全,但会显著影响您网站的UX。
  • secure 以帮助防止中间人攻击。
  • httpOnly 以帮助防止XSS。
    • 设置此值意味着cookie不能再从您的JS代码中访问。

然后必须使用中间件将cookie值转换为CKAN可以解释的头

NGINX服务器示例(nginx是默认/推荐的CKAN反向代理服务器)(《https://docs.ckan.org/en/latest/maintaining/installing/deployment.html》)

# Add the cookie-based API token to the request Authorization header
# This is passed to the CKAN backend & read automatically by CKAN
proxy_set_header 'Authorization' $cookie_${AUTH_COOKIE_NAME};

# If using caching omit the cookie
proxy_cache_bypass $cookie_${AUTH_COOKIE_NAME};
proxy_no_cache $cookie_${AUTH_COOKIE_NAME};

Apache服务器示例

SetEnvIf Cookie "(^|;\ *)${AUTH_COOKIE_NAME}=([^;\ ]+)" ckan_cookie_value=$2
RequestHeader set Authorization "%{ckan_cookie_value}e"

注意

  • 还建议禁用通过cookie访问API,以帮助防止CSRF攻击:ckan.auth.disable_cookie_auth_in_api = true
  • API令牌的配置可以在核心配置中设置
api_token.nbytes = 60
api_token.jwt.decode.secret = string:YOUR_SUPER_SECRET_STRING
api_token.jwt.algorithm = HS256

# expire_api_token plugin (unit = 1 day in seconds, lifetime = 3 days)
expire_api_token.default_lifetime = 3
expire_api_token.default_unit = 86400

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

ckanext-passwordless-api-1.1.8.tar.gz (15.9 kB 查看哈希值)

上传时间

构建分发

ckanext_passwordless_api-1.1.8-py3-none-any.whl (15.0 kB 查看哈希值)

上传时间 Python 3

由支持