clarkwinkelmann / flarum-ext-jwt-cookie-login
Flarum通过JWT cookie实现无状态登录
Requires
- ext-json: *
- firebase/php-jwt: ^6.0
- flarum/core: ^1.2
- guzzlehttp/guzzle: ^7.0
README
此扩展在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