clarkwinkelmann/flarum-ext-jwt-cookie-login

Flarum通过JWT cookie实现无状态登录

1.0.0 2022-04-19 13:49 UTC

This package is auto-updated.

Last update: 2024-09-16 18:18:14 UTC


README

MIT license Latest Stable Version Total Downloads Donate

此扩展在Flarum中实现了基于JWT的准无状态会话。

此扩展的使用场景是实施由作为主机的外部平台提供的全局登录。您的代码负责设置和更新cookie,而Flarum将自动根据JWT的内容连接和/或创建用户。没有提供主实现的示例代码。以下信息应允许您在任何编程语言中实现它。

用户通过数据库中的jwt_subject列进行匹配,该列与令牌的sub值相匹配。

默认情况下,使用Google Firebase公共密钥(自动从Google服务器检索和缓存)验证令牌,但也可以使用自定义密钥。

可以定义一个回调钩子,从外部API获取新用户的默认值。

可以通过使用替换代码{uid}作为钩子URL的一部分、读取Authorization头中的JWT或读取钩子JSON POST体中的data.id值来检索钩子调用的JWT主题ID。

钩子应返回一个符合JSON:API的对象,描述Flarum用户属性。这些属性将被传递到内部的POST /api/users,因此任何由扩展添加的属性也可以提供。

{
  "data": {
    "attributes": {
      "username": "example",
      "email": "example@app.tld"
    }
  }
}

可以通过Authorization头检查钩子请求的有效性。默认情况下,它将包含Token <JWT token>,但可以通过管理员设置自定义为一个硬编码的秘密令牌。自定义头设置将作为头部值直接应用,而不添加任何前缀(即,不添加Token )。

可以通过使用PATCH /api/jwt/users/<sub>端点通过JWT主题ID编辑用户。它的工作方式与PATCH /api/users/<id>完全相同,但使用JWT主题ID而不是Flarum ID。

默认情况下,所有帐户都将自动启用。您可以通过在注册钩子中返回"isEmailConfirmed": false属性来更改此行为。

内部使用管理员用户调用创建新Flarum用户的REST API。默认情况下,将使用ID为1的用户,但可以在管理员设置中自定义。此值必须是Flarum ID(MySQL自动增量)而不是JWT主题ID。

原始Flarum会话对象(Symfony会话)和cookie不用于无状态认证,但是因为Flarum和一些扩展不能在没有它的情况下工作,所以保留cookie会话。此会话对象在无状态JWT认证的“登录”和“注销”期间不会被无效化,因此可能会有问题,因为某些扩展依赖于该对象进行其他目的,而不是验证消息。

隐藏的Iframe

隐藏的Iframe提供了一种在后台刷新cookie的方法,并可选择提供自动登录。

如果设置了隐藏的Iframe设置,则将在浏览器视口外放置的0x0 iframe中加载给定的URL。

iframe可以使用window.postMessage通知Flarum会话状态的变化。消息可以在任何时间发送,可以发送任何次数。如果需要,可以使用循环重复发送当前状态。

Flarum会检查报告状态的变化,并在状态发生变化时提示用户刷新页面。

如果Flarum处于登出状态时发送了{jwtSessionState: 'login'},Flarum会表示用户已自动登录,并可能刷新页面。

如果Flarum处于登录状态时发送了{jwtSessionState: 'logout'},Flarum会表示会话已过期,用户可能需要刷新页面。

如果Flarum启动和postMessage之间的时间差小于配置的“自动登录延迟”,页面将无需用户交互而刷新。

在不经过登出状态的情况下切换用户目前不支持。

iframe的代码示例

window.parent.postMessage({
  jwtSessionState: 'login',
}, 'https://myforum.mydomain.tld');

最后一个参数应设置为Flarum的origin。也可以使用'*',但不推荐。

安装

composer require clarkwinkelmann/flarum-ext-jwt-cookie-login

支持

此扩展处于最小维护状态。

它是为某个客户开发的,作为开源项目发布,以造福社区。我可能会免费发布简单的错误修复或兼容性更新。

您可以联系我赞助额外功能或更新。

通过Flarum社区线程提供“尽力而为”的支持。

赞助商:Dater.com

链接