amazon-web-services - 您应该使用客户端凭据授权类型来验证服务器到服务器吗?

我正在创建一个 API 服务(“我的 Api”),其中最终用户是其他 API(“客户”)。这是我的第一个应用程序,其中客户端不是真实的人,所以我想确保我正确地完成了身份验证流程。

我正在使用 AWS Cognito 并基于此 post 的“客户端凭据授予”部分进行身份验证.

我现在的流程是:

  1. 客户使用 My Api 注册
  2. My Api 在 AWS 上创建了一个应用程序客户端。我有一个简单的仪表板,它将向客户端显示 client_id 和 client_secret(我的 Api 公开了一个端点来轮换 client_secrets)
  3. 客户端将以下 POST 发送到我的 AWS oauth2 域
curl -X POST \
  https://[DOMAIN_NAME].auth.[REGION].amazoncognito.com/oauth2/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'authorization: Basic BASE64(client_id:client_secret)' \
  -d 'grant_type=client_credentials&scope=[SCOPE]'
  1. 客户端以 jwt 的形式从 AWS 接收 access_token
  2. 客户端将授权头中的access_token发送到My Api
  3. 我的 API 验证 access_token 是否有效
  4. My Api 提供对适用范围和 client_id 的资源的访问

我必须在 AWS Cognito 上为每个客户端创建一个应用程序客户端,这似乎很奇怪。当您使用客户端凭据而不是授权代码进行身份验证时,这是否正常?

如果是这样,有人可以告诉我每个应用程序客户端的定价是多少吗?是否位于此 page 的“直接使用其用户池凭据或社交身份提供商登录的用户:”部分中?

最佳答案

经过一段时间的思考,这就是我要做的(前言:这绝对不是AWS/Banking级别的认证)。以下代码在 postgres 中。

我会设计数据库架构以容纳多个租户 see this paper by Google for ideas .每个用户(例如,组织的员工)都会有一个 Cognito 用户,该用户将链接到该用户。

CREATE TABLE organizations (
  org_id uuid
);

CREATE TABLE users (
  user_id      uuid,
  cognito_uid  uuid,
  org_id       uuid REFERENCES organizations(org_id)
);

CREATE TABLE secret_stuffs (
  secrets   varchar
);

然后我会创建一个 api_keys 表。

// We only want user to have two keys max
CREATE TYPE api_key_type AS ENUM (
  'primary',
  'secondary'
);

CREATE TABLE api_keys (
  PRIMARY KEY (
    user_id,
    key_type
  )

  org_id       uuid REFERENCES organizations(org_id),
  user_id      uuid REFERENCES users(user_id),
  key_type     api_key_type,
  private_key  varchar
);

// You'd probably want to create a composite index with user_id and private_key fields since we'll create a function that access both

我会锁定 api_keyssecret_stuffs 表(即,不授予对任何角色的访问权限)并创建一个 SECURITY DEFINER 函数将 user_idprivate_key 作为输入,检查该行是否存在于您的 api_keys 表中,并从 secret_stuffs 表。

https://stackoverflow.com/questions/58896430/

相关文章:

apache-spark - 使用来自 s3 存储桶的数据在 AWS EMR 上使用 pyspark

leaflet - 校正 Rayshader 的卫星图像覆盖

python - 如何使用需要使用 MLflow 的二维以上输入形状的模型进行预测?

android-studio - 为什么我只看到官方 android 类的反编译源代码?

javascript - 单击通知打开已安装的 PWA

java - 如何设置不需要凭据的 Localstack 容器?

javascript - 如何使用 ngx-export-as 中的选项

google-cloud-platform - 使用 --allow-unauthenticated

gradle - pivotal/LicenseFinder 为 Gradle 项目返回 "No d

linux - Podman (libpod) 在使用 SELinux 上下文挂载 shm 时无法运