侧边栏壁纸
博主头像
另起一行(hang)博主等级

胡编一通,乱写一气

  • 累计撰写 28 篇文章
  • 累计创建 29 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

新坑尝鲜 | Hasura GraphQL 引擎

Wissy
2021-11-13 / 0 评论 / 0 点赞 / 62 阅读 / 4677 字

一、介绍

Hasura 是一个 Graph QL 的后端工具,熟悉 Graph QL 的应该都知道 Apollo Graph,不同之处是 Hasura 能将数据库的表映射成Graph QL,有丰富的权限/角色管理认证,Pro 版本还提供了监控模块。

二、权限认证模块

Hasura 的认证官方文档介绍有2种方式,但是比较恍惚不清,点这里查看官网文档,在这里主要介绍一下具体项目使用的配置。

这里有些Debug相关的配置:

  1. 在这里查看Hasura 环境变量和参数的mapping关系,官网查看

  2. Web Console 界面提供X-Hasura-Admin-Secret​提供调试,这个是Admin权限,需要取消勾选。

  3. 为了调试方便可以将日志级别和白名单关闭

- name: HASURA_GRAPHQL_ENABLED_LOG_TYPES
  value: "startup, http-log, webhook-log, websocket-log, query-log"
- name: HASURA_GRAPHQL_LOG_LEVEL
  value: "info"
- name: HASURA_GRAPHQL_ENABLE_ALLOWLIST
  value: "false"
  1. Webhook
    这种方式主要是需要提供一个新的API,这个API需要按照 Hasura 的规约给其返回一个JSON,原理上每次访问 Hasura 都会来这个 API 获取权限信息。
    缺点:每次访问需要一定的开销,如果流量比较大需要注意 API 瓶颈问题。
    优点:自主可控不需要担心Token主动失效问题。规约如下:

    1. 需要在ENVHASURA_GRAPHQL_AUTH_HOOK​或者参数--auth-hook​ 配置API地址

    2. 配置HASURA_GRAPHQL_AUTH_HOOK_MODE​或者参数--auth-hook-mode​ 配置API访问方法,提供GET​和POST​(需大写)。

    3. API规约
      API的输入其实都是转发,包含Header​ 和Body​,X-Forwarded-*​和X-Real-Ip​是转发需要的参数,为了方便在代理端获取真实的IP。
      API的输出必须是Success(200)的JSON类型,并且需要必须包含X-Hasura-User-Id​和X-Hasura-Role​字段,字段值必须是String类型。

    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
        "X-Hasura-User-Id": "1",
        "X-Hasura-Role": "user",
        "X-Hasura-Org-Id": "test",
        "X-Hasura-Org-Owner": "true"
    }
    
  2. JWT(Token)
    JWT 其实是将认证给了受信任的第三方授权平台,第三方平台会给用户返回一个Token,请求Hasura的时候需要提供这个Token,第三方授权平台和Hasura配置同一个public key。
    优点:性能较好不需要每次请求API。
    缺点:缺少自主控制权(Token失效问题)。auth-jwt-overview1.png

步骤如下:

  1. 需要配置一下授权平台,如果为了方便可以使用Auth0Firebase。也可以使用MyJWK网站,生成自己的jwk密钥,然后使用程序统一去管理。

  2. JWT 2 PEM中生成public key,配置到 Hasura 中。

    # JWT Auth 认证
            - name: HASURA_GRAPHQL_UNAUTHORIZED_ROLE
              value: "nologin"
            # stringified_json
            - name: HASURA_GRAPHQL_JWT_SECRET
              value: '{
                      "type": "RS256",
                      "key": "-----BEGIN PUBLIC KEY-----\nxxx\n-----END PUBLIC KEY-----\n",
                      "claims_map": {
                              "x-hasura-allowed-roles": {"path":"$.allRoles"},
                              "x-hasura-default-role" : {"path":"$.defaultRole"},
                              "x-hasura-user-id"      : {"path":"$.userIDStr"},
                              "x-hasura-bookeeping-id": {"path":"$.bookeepingId"},
                              "x-hasura-org-id"       : {"path":"$.orgId"},
                              "x-hasura-org-Owner"    : {"path":"$.orgIsOwner"},
                              "x-hasura-role"         : {"path":"$.role"}
                              }
                      }'
    

​HASURA_GRAPHQL_UNAUTHORIZED_ROLE​变量配置未授权默认角色用户。

​HASURA_GRAPHQL_JWT_SECRET​配置JWT的公钥和其他信息(JSON字符串),type​和 key​是必须的,其他都是非必需的,如果认证平台分网站或者App则推荐 claims_namespace​,或者使用 claims_map​无侵害的配置。推荐后者。

type: 密钥加密方式
key:  具体密钥
jwk_url: 密钥认证的网站网站(具体作用可以去官网看看)
claims_namespace: 域名地址(也就是JWT Token里面需要包含的key,从这个key里面取相对应的信息)"http://xxx.com/xxx"
claims_namespace_path: 同上,但是指定key进行 "$.xxx" 
claims_format: "json(字典集合)|stringified_json(字符串JSON)" 
audience: 目标受众,指定app
issuer: 安全需要,每次检查时候匹配
claims_map: Hasura和Token 映射关系
allowed_skew: 时钟偏差
header: 从哪个header获取JWT

三、QA

  1. ​query is not in any of the allowlists​
    设置HASURA_GRAPHQL_ENABLE_ALLOWLIST="false"​

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区