jasonmccallister / hasura
使用Craft CMS凭证通过Hasura.io驱动的GraphQL API进行身份验证
Requires
- craftcms/cms: ^3.5.0
- firebase/php-jwt: ^5.0
This package is auto-updated.
Last update: 2024-09-30 01:37:50 UTC
README
使用Craft CMS凭证通过Hasura.io驱动的GraphQL API进行身份验证
要求
此插件需要Craft CMS 3.5.0或更高版本。
安装
要安装此插件,请按照以下说明操作。
-
打开您的终端并转到您的Craft项目
cd /path/to/project
-
然后告诉Composer加载插件
composer require jasonmccallister/hasura
-
在控制面板中,转到设置→插件,并为Hasura点击“安装”按钮。
Hasura概览
Hasura.io是一个开源工具,它允许您在不编写任何代码的情况下构建实时GraphQL API。Hasura可以让您连接到一个新的或现有的PostgreSQL数据库,并自动构建一个带有实时订阅的GraphQL模式;无需编写任何代码即可实现!
这使得您可以使用数据库和Docker镜像,无需编写任何代码,即可大规模构建GraphQL API!
观看此视频,Hasura团队将一个复杂的应用程序数据库(示例中使用Gitlab数据库)在不到4分钟内放入GraphQL。
开箱即用,Hasura包括以下功能:
- 自动生成模式,包括嵌套关系
- 基于您的数据库的GraphQL查询和突变
- 支持订阅,允许实时UI更新
- 远程模式,允许您组合多个GraphQL API
- 新项目的迁移
- 基于数据库操作的触发器(插入、更新和删除)
- 动态访问角色和身份验证
然而,Hasura可以被配置为接受以特定格式签名的JWT。这就是Hasura插件发挥作用的地方。此插件允许您使用Craft CMS用户和组生成JWT以发送到您的Hasura API。
配置Hasura
安装后,您需要在插件设置中设置一些项
- 启用或禁用CSRF(如果外部应用程序将使用此端点进行JWT,则需要禁用CSRF)
- 设置Hasura API期望的JWT签名方法(RS256等)
- 输入密钥(字符串或私有令牌)
使用Craft CMS作为Hasura的认证
用户将使用他们的用户名(或如果Craft配置了电子邮件,则为电子邮件)和密码进行认证到
https://yourdomain.com/hasura/auth
示例响应
{ "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwNGZjNDM5Mi0wMmNlLTQ3MTgtYmQ5My03ODhjMWI1ZTU1ZjQiLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNTUzMDc5MjY5LCJleHAiOjE1NTMwODI4NjksImh0dHBzOlwvXC9oYXN1cmEuaW9cL2p3dFwvY2xhaW1zIjp7IngtaGFzdXJhLWFsbG93ZWQtcm9sZXMiOlsidXNlciIsImFkbWluIl0sIngtaGFzdXJhLWRlZmF1bHQtcm9sZSI6ImFkbWluIiwieC1oYXN1cmEtdXNlci1pZCI6IjA0ZmM0MzkyLTAyY2UtNDcxOC1iZDkzLTc4OGMxYjVlNTVmNCJ9fQ.WEAFZYon5arnCTN9ecAEiG4dKl-jkyk3em8EpJ9N0Vs" }
示例JWT
{ "sub": "04fc4392-02ce-4718-bd93-788c1b5e55f4", "admin": true, "iat": 1553079269, "exp": 1553082869, "https://hasura.io/jwt/claims": { "x-hasura-allowed-roles": ["user", "admin"], "x-hasura-default-role": "admin", "x-hasura-user-id": "04fc4392-02ce-4718-bd93-788c1b5e55f4" } }
配置Craft CMS以处理来自Hasura的事件触发Webhook
Hasura允许您将事件绑定到表操作,如插入、更新和删除。这些被称为事件触发器。此插件允许您通过配置Hasura将事件触发器发送到Craft CMS来接收这些事件触发器。
https://yourdomain.com/hasura/webhook
您还可以在插件设置中配置Hasura将发送的标题以及密钥。当收到事件触发器有效负载时,插件将触发hasuraEventTrigger
事件,并允许您监听事件并采取行动。
事件包含以下内容
- table:事件来自的表名称(例如
todos
) - trigger:触发器的名称(例如
send_updated_todo_to_craft
) - 有效负载:事件的负载,包含新数据和旧数据(根据触发类型)
在插件设置中通过Twig字段添加自定义声明
您可以通过插件设置中的新“自定义声明”字段将自定义声明(例如用户名或自定义字段)添加到JWT令牌中。您可以添加任何附加信息以及特定于用户的详细信息,因为该字段接受user
变量。在Hasura中,您可以根据x-hasura-custom-claim
对象编写规则。
示例twig查询
{{user.fullName}}
示例JWT
{ "sub": "04fc4392-02ce-4718-bd93-788c1b5e55f4", "admin": true, "iat": 1553079269, "exp": 1553082869, "https://hasura.io/jwt/claims": { "x-hasura-allowed-roles": ["user", "admin"], "x-hasura-default-role": "admin", "x-hasura-user-id": "04fc4392-02ce-4718-bd93-788c1b5e55f4", "x-hasura-custom-claim": "John Doe" } }
自定义声明数组的当前限制
由于Hasura只接受字符串形式的自定义声明,我们需要取消数组的包装并将它们作为单个声明添加。插件会为您做这件事,但只限于第一层。递归映射将在以后添加。更多信息请见:hasura/graphql-engine#1902
返回对象/数组的示例twig查询
{% set customCategory = user.customCategory.one() %} {% if customCategory %} {% set jsonObject = { "user-name": user.fullName, "category-uid": customCategory, "category-title": customCategory, "category-slug": customCategory } %} {{ jsonObject | json_encode() }} {% endif %}
示例JWT
{ "sub": "04fc4392-02ce-4718-bd93-788c1b5e55f4", "admin": true, "iat": 1553079269, "exp": 1553082869, "https://hasura.io/jwt/claims": { "x-hasura-allowed-roles": ["user", "admin"], "x-hasura-default-role": "admin", "x-hasura-user-id": "04fc4392-02ce-4718-bd93-788c1b5e55f4", "x-hasura-custom-user-name": "John Doe", "x-hasura-custom-category-uid": "071cd618-e675-4bcc-b362-0311b43333c9", "x-hasura-custom-category-title": "Category Name", "x-hasura-custom-category-slug": "category-name" } }