我正在创建一个 API 服务(“我的 Api”),其中最终用户是其他 API(“客户”)。这是我的第一个应用程序,其中客户端不是真实的人,所以我想确保我正确地完成了身份验证流程。
我正在使用 AWS Cognito 并基于此 post 的“客户端凭据授予”部分进行身份验证.
我现在的流程是:
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]'
我必须在 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_keys
和 secret_stuffs
表(即,不授予对任何角色的访问权限)并创建一个 SECURITY DEFINER
函数将 user_id
和 private_key
作为输入,检查该行是否存在于您的 api_keys
表中,并从 secret_stuffs 表。
https://stackoverflow.com/questions/58896430/
相关文章:
apache-spark - 使用来自 s3 存储桶的数据在 AWS EMR 上使用 pyspark
leaflet - 校正 Rayshader 的卫星图像覆盖
python - 如何使用需要使用 MLflow 的二维以上输入形状的模型进行预测?
android-studio - 为什么我只看到官方 android 类的反编译源代码?
java - 如何设置不需要凭据的 Localstack 容器?
javascript - 如何使用 ngx-export-as 中的选项
google-cloud-platform - 使用 --allow-unauthenticated