使用Craft CMS凭证通过Hasura.io驱动的GraphQL API进行身份验证

安装: 57

依赖: 0

建议者: 0

安全: 0

星星: 7

关注者: 2

分支: 2

开放问题: 7

类型:craft-plugin

v1.2.0 2020-10-26 20:35 UTC

README

使用Craft CMS凭证通过Hasura.io驱动的GraphQL API进行身份验证

Hasura Logo

要求

此插件需要Craft CMS 3.5.0或更高版本。

安装

要安装此插件,请按照以下说明操作。

  1. 打开您的终端并转到您的Craft项目

    cd /path/to/project
    
  2. 然后告诉Composer加载插件

    composer require jasonmccallister/hasura
    
  3. 在控制面板中,转到设置→插件,并为Hasura点击“安装”按钮。

Hasura概览

Hasura.io是一个开源工具,它允许您在不编写任何代码的情况下构建实时GraphQL API。Hasura可以让您连接到一个新的或现有的PostgreSQL数据库,并自动构建一个带有实时订阅的GraphQL模式;无需编写任何代码即可实现!

这使得您可以使用数据库和Docker镜像,无需编写任何代码,即可大规模构建GraphQL API!

观看此视频,Hasura团队将一个复杂的应用程序数据库(示例中使用Gitlab数据库)在不到4分钟内放入GraphQL。

Instant GraphQL on GitLab

开箱即用,Hasura包括以下功能:

  1. 自动生成模式,包括嵌套关系
  2. 基于您的数据库的GraphQL查询和突变
  3. 支持订阅,允许实时UI更新
  4. 远程模式,允许您组合多个GraphQL API
  5. 新项目的迁移
  6. 基于数据库操作的触发器(插入、更新和删除)
  7. 动态访问角色和身份验证

然而,Hasura可以被配置为接受以特定格式签名的JWT。这就是Hasura插件发挥作用的地方。此插件允许您使用Craft CMS用户和组生成JWT以发送到您的Hasura API。

配置Hasura

安装后,您需要在插件设置中设置一些项

  1. 启用或禁用CSRF(如果外部应用程序将使用此端点进行JWT,则需要禁用CSRF)
  2. 设置Hasura API期望的JWT签名方法(RS256等)
  3. 输入密钥(字符串或私有令牌)

使用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
  • 有效负载:事件的负载,包含新数据和旧数据(根据触发类型)

Jason McCallister提供

在插件设置中通过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"
  }
}