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

标签 amazon-web-services authentication oauth-2.0 amazon-cognito access-token

我正在创建一个 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< 返回您需要的任何内容 表。

关于amazon-web-services - 您应该使用客户端凭据授权类型来验证服务器到服务器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58896430/

相关文章:

ios - 在 App 中从 SSO 获取 access_token 时 OAuth2 请求上的 invalid_grant

google-api - 通过 OAuth 2.0 和私钥又名服务帐户访问 Google Contacts Api

swift - AWS iOS 开发工具包 : Using both S3 and Mobile Analytics in two different regions

amazon-web-services - 我可以在没有用户名的情况下使用电子邮件或电话号码注册密码并在以后为它们设置别名吗

amazon-web-services - AWS Lambda 函数未保存在 VPC 选择上

authentication - SSH "Failed to add the host to the list of known hosts"Openshift

python - Pyramid - 如何创建避免身份验证的路由

c# - 在 OneDrive 上创建文本文件以设置和获取数据

angular - OpenID 连接 : Implicit or Auth Code flow for SPAs?

python - AWS CLI - aws configure 命令有效凭证返回错误