一、介绍
Hasura 是一个 Graph QL 的后端工具,熟悉 Graph QL 的应该都知道 Apollo Graph,不同之处是 Hasura 能将数据库的表映射成Graph QL,有丰富的权限/角色管理认证,Pro 版本还提供了监控模块。
二、权限认证模块
Hasura 的认证官方文档介绍有2种方式,但是比较恍惚不清,点这里查看官网文档,在这里主要介绍一下具体项目使用的配置。
这里有些Debug相关的配置:
在这里查看Hasura 环境变量和参数的mapping关系,官网查看。
Web Console 界面提供X-Hasura-Admin-Secret提供调试,这个是Admin权限,需要取消勾选。
为了调试方便可以将日志级别和白名单关闭
- 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"
Webhook
这种方式主要是需要提供一个新的API,这个API需要按照 Hasura 的规约给其返回一个JSON,原理上每次访问 Hasura 都会来这个 API 获取权限信息。
缺点:每次访问需要一定的开销,如果流量比较大需要注意 API 瓶颈问题。
优点:自主可控不需要担心Token主动失效问题。规约如下:需要在ENVHASURA_GRAPHQL_AUTH_HOOK或者参数--auth-hook 配置API地址
配置HASURA_GRAPHQL_AUTH_HOOK_MODE或者参数--auth-hook-mode 配置API访问方法,提供GET和POST(需大写)。
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" }
JWT(Token)
JWT 其实是将认证给了受信任的第三方授权平台,第三方平台会给用户返回一个Token,请求Hasura的时候需要提供这个Token,第三方授权平台和Hasura配置同一个public key。
优点:性能较好不需要每次请求API。
缺点:缺少自主控制权(Token失效问题)。
步骤如下:
需要配置一下授权平台,如果为了方便可以使用Auth0和Firebase。也可以使用MyJWK网站,生成自己的jwk密钥,然后使用程序统一去管理。
在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
query is not in any of the allowlists
设置HASURA_GRAPHQL_ENABLE_ALLOWLIST="false"
评论区