您是否应该使用“客户端证书授予类型”来认证服务器到服务器?

我正在创建一个api服务(“我的Api”),最终用户是其他api(“客户端”)。这是我的第一个应用程序,客户端不是真实的人,因此我想确保自己正确通过了身份验证流程。

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

我现在的流程是:

  1. 客户向我的Api注册
  2. 我的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. 客户端从AWS接收jwt形式的access_token
  2. 客户端将授权标头中的access_token发送到“我的Api”
  3. 我的Api验证access_token是否有效
  4. 我的Api提供对适用范围和client_id的资源的访问权限

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

如果是这样,有人可以指导我了解每个应用程序客户的价格是多少吗?是否在此page上的“使用用户池凭据或社交身份提供者直接登录的用户:”部分中?

beachboys 回答:您是否应该使用“客户端证书授予类型”来认证服务器到服务器?

经过一段时间的思考,这就是我要做的(序言:这绝对不是AWS /银行级别的身份验证)。下面的代码在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_id和{{ 1}}作为输入,检查private_key表中是否存在该行,并从api_keys表中返回所需的内容。

,

几个月前,当我们不得不验证来自服务器端应用程序的请求时,我面临着同样的挑战。根据我的研究,隐式流和授权码流适用于前端登录身份验证,客户端凭证流适用于机器对机器。我还设置了一个单独的数据库,以映射我们计划进行身份验证的每个服务器端应用程序的客户端应用程序ID。

我在如何使用OAuth 2.0客户端凭据流上找到了这个tutorial。详细讨论了如何在邮递员中进行测试的示例。

Authorization: Basic BASE64(CLIENT_ID:CLIENT_SECRET)
本文链接:https://www.f2er.com/3088112.html

大家都在问