跳转至

认证方案

1. 说明

  • 认证包含:客户端认证和站点认证

  • 认证配置: $FATE_BASE/conf/service_conf.yaml

# 站点鉴权时需要配置本方站点id
party_id:
# 钩子模块,需要根据不同场景配置不同的钩子
hook_module:
  client_authentication: fate_flow.hook.flow.client_authentication
  site_authentication: fate_flow.hook.flow.site_authentication
# 第三方认证服务名
hook_server_name:
authentication:
  client:
    # 客户端认证开关
    switch: false
    http_app_key:
    http_secret_key:
  site:
    # 站点认证开关
    switch: false
  • 认证方式:支持flow自带的认证模块认证和第三方服务认证。可通过hook_module修改认证钩子,当前支持如下钩子:
  • client_authentication支持"fate_flow.hook.flow.client_authentication"和"fate_flow.hook.api.client_authentication", 其中前者是flow的客户端认证方式,后者是第三方服务客户端认证方式;
  • site_authentication支持"fate_flow.hook.flow.site_authentication"和"fate_flow.hook.api.site_authentication",其中前者是flow的站点端认证方式,后者是第三方服务站点认证方式。

2. 客户端认证

2.1 flow认证

2.1.1 配置

hook_module:
  client_authentication: fate_flow.hook.flow.client_authentication
authentication:
  client:
    switch: true
    http_app_key: "xxx"
    http_secret_key: "xxx"

2.2.2 接口鉴权方式

则所有客户端发送到 Flow 的请求都需要增加以下 header

TIMESTAMP:Unix timestamp,单位毫秒,如 1634890066095 表示 2021-10-22 16:07:46 GMT+0800,注意该时间与服务器当前时间的差距不能超过 60 秒

NONCE:随机字符串,可以使用 UUID,如 782d733e-330f-11ec-8be9-a0369fa972af

APP_KEY:需与 Flow 配置文件中的 http_app_key 一致

SIGNATURE:基于 Flow 配置文件中的 http_secret_key 和请求参数生成的签名

2.2.3 签名生成方法

  • 按照顺序组合下列内容

TIMESTAMP

NONCE

APP_KEY

请求路径+查询参数,如没有查询参数则不需要末尾的 ?,如 /v1/job/submit/v1/data/upload?table_name=dvisits_hetero_guest&namespace=experiment

如果 Content-Typeapplication/json,则为原始 JSON,即 request body;如果不是,此项使用空字符串填充

如果 Content-Typeapplication/x-www-form-urlencodedmultipart/form-data,则需要把所有参数以字母顺序排序并 urlencode,转码方式参照 RFC 3986(即除 a-zA-Z0-9-._~ 以外的字符都要转码),注意文件不参与签名;如果不是,此项使用空字符串填充

  • 把所有参数用换行符 \n 连接然后以 ASCII 编码

  • 使用 HMAC-SHA1 算法,以 Flow 配置文件中的 http_secret_key 为密钥,算出二进制摘要

  • 使用 base64 编码二进制摘要

2.2.4 示例

可以参考 Fate SDK

2.2 第三方服务认证

2.2.1 配置

hook_module:
  client_authentication: fate_flow.hook.api.client_authentication
authentication:
  client:
    switch: true
hook_server_name: "xxx"

2.2.2 接口鉴权方式

  • 第三方服务需要向flow注册客户端认证接口,具体参考客户端认证服务注册
  • 若认证失败,flow会直接返回认证失败给客户端。

3. 站点认证

3.1 flow认证

3.1.1 配置

party_id: 9999
hook_module:
  site_authentication: fate_flow.hook.flow.site_authentication
authentication:
  client:
    switch: true
    http_app_key: "xxx"
    http_secret_key: "xxx"

3.1.2 认证方案

  • flow启动时会生成一对公钥和私钥,需要和合作方交换彼此的公钥,发送请求时通过RSA算法使用公钥生成签名,被请求站点通过其共钥验证签名。
  • flow提供密钥管理cli,如下

3.1.3 密钥管理

  • 添加合作方公钥

用于保存其它fate站点公钥信息,即为和其他站点合作

flow key save -c fateflow/examples/key/save_public_key.json

选项

参数 短格式 长格式 必选 类型 说明
conf_path -c --conf-path string 配置路径

注: conf_path为参数路径,具体参数如下

参数名 必选 类型 说明
party_id string 站点id
key string 站点公钥

返回

参数名 类型 说明
retcode int 返回码
retmsg string 返回信息

样例

{
    "retcode": 0,
    "retmsg": "success"
}
  • 删除合作方公钥

删除合作方站点公钥,即为取消合作关系

flow key delete -p 9999

选项

参数 短格式 长格式 必选 类型 说明
party_id -p --party-id string 站点id

返回

参数名 类型 说明
retcode int 返回码
retmsg string 返回信息

样例

{
    "retcode": 0,
    "retmsg": "success"
}
  • 查询共钥

用于查询本方或合作方fate站点公钥信息

flow key query -p 9999
选项

参数 短格式 长格式 必选 类型 说明
party_id -p --party-id string 站点id

返回

参数名 类型 说明
retcode int 返回码
retmsg string 返回信息
data object 返回数据

样例

{
  "data": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzxgbxa3cfhvwbu0AFfY/\nkm7uFZ17J0EEDgaIWlrLakds7XboU5iOT0eReQp/KG3R0fVM9rBtdj8NcBcArtZ9\n2242Atls3jiuza/MPPo9XACnedGW7O+VAfvVmq2sdmKZMX5l7krEXYN645UZAd8b\nhIh+xf0qGW6IgxyKvqF13VxxB7OMUzUwyY/ZcN2rW1urfdXsCNoQ1cFl3KaarkHl\nn/gBMcCDvACXoKysFnFE7L4E7CGglYaDBJrfIyti+sbSVNxUDx2at2VXqj/PohTa\nkBKfrgK7sT85gz1sc9uRwhwF4nOY7izq367S7t/W8BJ75gWsr+lhhiIfE19RBbBQ\n/wIDAQAB\n-----END PUBLIC KEY-----",
  "retcode": 0,
  "retmsg": "success"
}

3.2 第三方服务认证

3.2.1 配置

hook_module:
  site_authentication: fate_flow.hook.api.site_authentication
authentication:
  site:
    switch: true
hook_server_name: "xxx"

3.2.2 接口鉴权方式

  • 第三方服务需要向flow注册站点认证接口,具体参考站点认证服务注册
  • 若认证失败,flow会直接返回认证失败给发起方。