HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

Cognito, OIDC 实现 S3 精细化权限控制

  • 2019-09-20
  • 本文字数:5991 字

    阅读完需:约 20 分钟

Cognito, OIDC 实现 S3 精细化权限控制

在现代化应用中,用户文件通常存储在对象存储中,客户端通过 HTTP 的方式直接操作对象存储中的文件。 在实际应用过程中,我们经常遇到这样的需求:只允许用户 上传/下载/删除/修改(CRUD) 自己的文件。 本文将探讨利用 Amazon Cognito Identity Pool, OpenID Connect 实现精细化权限控制,限制用户只能访问自己的文件。


Amazon S3 是一个对象存储服务,非常适合存储海量文件。 它不仅支持从服务器端上传/下载 S3 中的内容,同时允许客户从客户端直接上传/下载 S3 中的资源。


Amazon Cognito Identity Pool 可以为您的用户创建唯一身份,并将它们与身份提供商联合。有了身份池,您便可以获取权限受限的 临时 AWS 凭证以访问其他 AWS 服务。


OpenID Connect 是在基于 OAuth 2.0 协议的基础上提供通过 API 进行身份交互的规范。

实验前提

  1. 本文将使用 Auth0 作为用户库。请注册 Auth0 账户,并按照 文档添加 application。 这并不要求用户一定使用 Auth0, 只要是支持 OpenID Connect 标准的用户库都 可以使用次方法。

  2. 本文架构部署使用 terraform 一键部署 AWS 资源, 请在本机安装 terraform, 并配置好 AWS Credentials

  3. Demo 包含前端 Web 应用,使用 yarn 做依赖管理,请自行安装 yarn

  4. 需要了解 OpenID Connect 的基本机制,包括 Access Token, ID Token.

  5. 本文使用 AWS China Region, 如使用 AWS Global Region, 请参考 AWS 区域与终端节点修改 endpoint。

架构和原理


客户端检测到用户未登陆,跳转到登陆授权页面。以下是跳转链接:


https://aws-cognito.auth0.com/authorize?client_id=n4JmCUjAA4P7cEIEC3KI9yy8Kt4COqOt&response_type=token%20id_token&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&scope=openid&state=VkFD4yrt9C2S2_qd67Xs8MHcBhxh2li0&nonce=xXaQ-2sQnBCwMbGc1y7e3r0KgbC5~3sO&auth0Client=eyJuYW1lIjoiYXV0aDAuanMiLCJ2ZXJzaW9uIjoiOS4xMC4xIn0%3D
复制代码


上述 HTTP request 中的 auth0Client 为 Auth0 增加的字段,非 OIDC 标准字段


  1. 客户端向 OpenID Connect Provider(OIDC) 发起登录请求,登陆成功后,跳转回步骤 1 中的 redirect_uri,并且在 HTTP URL 中包含 access token 和 ID Token。如下:


http://localhost:3000/callback#access_token=<access_token>&expires_in=7200&token_type=Bearer& state=vaXfc.jDtU5sr37K75QRw.~ZI4E5uLDA&id_token=<id_token>
复制代码


服务器在授权成功后返回信息如上。其中包含 id_token.


  1. 通过携带 ID Token 调用 API, 获得用户在 Cognito Identity Pool 中的 Identity ID.


POST https://cognito-identity.{region}.amazonaws.com.cn/HEADER    X-Amz-Target: AWSCognitoIdentityService.GetIdBODY{    "IdentityPoolId":"<cognito-identity-pool-id>",    "Logins":{        "<openid-connect-provider-domain>":"<id_token>"    }}
复制代码


Cognito Identity Pool 返回该用户的 Identity ID.


{    "IdentityId": "<identity-id>"}
复制代码


是用户在 OIDC 的 domain. 需要在 Cognito Identity Pool 中提前配置。该用户在下一次调用这个接口的时候,会返回相同的 Identity ID.


如果使用的 AWS China Region, 则 API 地址为 https://cognito-identity.{region}.amazonaws.com.cn/, 如果使用的是 AWS Global Region, 则 API 地址为 https://cognito-identity.{region}.amazonaws.com


  1. Cognito Identity Pool 调用 STS 服务,生成临时 AK/SK, 该步骤由 Cognito Identity Pool 自动完成, 对用户不可见。

  2. 通过步骤 3 中的 Identity ID 和步骤 2 中的 ID Token 换取该用户的临时 AK/SK


POST https://cognito-identity.{region}.amazonaws.com.cn/Header    X-Amz-Target: AWSCognitoIdentityService.GetCredentialsForIdentityBODY{    "IdentityId":"<identity-id>",    "Logins":{        "<openid-connect-provider-domain>":"<id_token>"    }}
复制代码


  1. 通过 AK/SK 完成 SigV4 签名,然后直接上传文件到 S3.

  2. 通过在 Cognito Identity Pool 配置 Authenticated Role 的权限,所有认证后的用户都具备该 Role 的权限。


Authenticated Role 所具有的 Policy 配置如下, 将其中的和替换为实际使用的值。${cognito-identity.amazonaws.com:sub} 是一个变量,其实际内容为该用户在 Cognito Identity Pool 中的 Identity ID。


{    "Version": "2012-10-17",    "Statement": [        {            "Sid": "ListYourObjects",            "Effect": "Allow",            "Action": "s3:ListBucket",            "Resource": [                "arn:aws-cn:s3:::<s3-bucket-name>"            ],            "Condition": {                "StringLike": {                    "s3:prefix": [                        "cognito/<app-name>/${cognito-identity.amazonaws.com:sub}"                    ]                }            }        },        {            "Sid": "ReadWriteDeleteYourObjects",            "Effect": "Allow",            "Action": [                "s3:GetObject",                "s3:PutObject",                "s3:DeleteObject"            ],            "Resource": [                "arn:aws-cn:s3:::<s3-bucket-name>/cognito/<app-name>/${cognito-identity.amazonaws.com:sub}",                "arn:aws-cn:s3:::<s3-bucket-name>/cognito/<app-name>/${cognito-identity.amazonaws.com:sub}/*"            ]        }    ]}
复制代码


在 Authenticated Role 中配置如上的策略,便可以实现用户只允许上传/下载/删除/列出自己的文件。

Demo 快速部署

获取代码点这里<<<


本文使用 Terraform 作为自动化资源创建工具,Terraform IT 是一款基础架构自动化编排工具, 如尚未安装,请按照文档下载并安装。


  1. 注册 Auth0 帐号,并添加 Application. 详细步骤请查看 Auth0 操作手册。 请注意,此处不强制使用 Auth0, 只要符合 OIDC 规范即可。记录下 Application 的 Domain 和 Client ID。 在 Settings -> Allowed Callback URLs 中输入 http://localhost:3000/callback

  2. 登陆 AWS 控制台,在 IAM Identity Provider 中点击 Create Provider,

  3. 在 Provider Type 中选择 OpenID Connect; 在 Provider URL 中输入 Auth0 的 Domain 字段 (必须是 https://开头); 在 Audience 中输入 Auth0 的 clientID

  4. 在 terraform/variables.tf 中修改变量的值。参数说明请参考注释

  5. 通过 Terraform 自动化部署 Cognito 及相关 IAM Role, IAM Policy


cd terraformterraform initterraform apply
复制代码


  1. 将 terraform 的输入 拷贝到 src/config.json 中,并保存配置文件

  2. 在项目根目录下安装 Web 依赖, 并运行前端程序


cd ..yarn installyarn start
复制代码


  1. 程序正常运行,登录后,选择文件,并上传


如果该系统部署在 AWS Global Region, 请务必将 IAM Policy 中的 aws-cn 改成 aws, Cognito 的 endpoint 修改为 https://cognito-identity.{region}.amazonaws.com/

运行 Demo

  1. 点击页面上的 Log In 按钮,跳转到 Auth0 的认证页面,输入用户名密码。 等待页面跳转回 Web App, 显示已经登陆,页面如下:


2.点击 Get AWS Credentials 按钮。等待弹出对话框



  1. 点击 Choose file 选择要上传的文件,此处只支持图片

  2. 点击 Upload 按钮,等待文件上传成功,并弹出对话框

  3. 查看 S3 Bucket, 发现 S3 中图片的 keyname 包含 Cognito Identity ID



至此,实验成功。想知道客户端的实现方式可查看, src 文件夹下的前端代码。 demo 程序的主要逻辑代码在 src/Auth.js 和 src/Home.js。


该解决方案也支持符合使用 SAML 标准的 Auth 系统。详细内容请 参考 SAML Identity Providers

如何销毁资源

  1. 删除 S3 内的文件

  2. 在 terraform 目录下运行 terraform destroy

  3. 在 IAM Identity Provider 中删除之前创建的 Identity Provider

参考文档

OpenID


Auth0 配置


JS S3 上传示例代码


作者介绍:


施乔


施乔,亚马逊 AWS 解决方案架构师,负责基于 AWS 的云计算方案的架构设计,在应用开发, Serverless, 大数据,IoT 方向有丰富的实践经验。


本文转载自博客 aws。


原文链接:


https://amazonaws-china.com/cn/blogs/china/cognito-oidc-realize-s3-management/


2019-09-20 09:00933
用户头像

发布了 1848 篇内容, 共 114.0 次阅读, 收获喜欢 78 次。

关注

评论

发布
暂无评论
发现更多内容

构建系列之新一代利器Esbuild(上)

江湖修行

cli 构建 esbuild 前端‘’

【零售电商系列】走进亚马逊之自建仓储&物流

小诚信驿站

6 月 优质更文活动

通过技术变革,推动全面预算管理前行

智达方通

全面预算管理

数据可视化设计四大原则透析

搞大屏的小北

数据可视化 设计要素 大屏设计

深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)

汀丶人工智能

人工智能 自然语言处理 深度学习 命名实体识别 6 月 优质更文活动

深度学习应用篇-自然语言处理[10]:N-Gram、SimCSE介绍,更多技术:数据增强、智能标注、多分类算法、文本信息抽取、多模态信息抽取、模型压缩算法等

汀丶人工智能

人工智能 自然语言处理 深度学习 命名实体识别 6 月 优质更文活动

平台即产品:数字化转型的全新驱动力

SEAL安全

平台工程 平台即产品

数据分析:电子商务需要关注的重要指标有哪些?

搞大屏的小北

电子商务 销售指标

分享几款 Mac 上非常好用的的免费软件

搞大屏的小北

数据可视化 数据库工具 截图软件 视屏转 gif 视频号下载

科兴未来|2023”福地句才”海外人才创业大赛

科兴未来News

【差分隐私】基本原理与入门级应用 | 京东云技术团队

京东科技开发者

京东云 差分隐私算法 企业号 6 月 PK 榜

Java线程池三、调优和性能优化

echoes

Java 线程池

Amazon CodeWhisperer 编程助手试用总结

Hanson

千万级数据的可视化交互展示:Vue.js 技术解析

xfgg

Vue eCharts 6 月 优质更文活动

KaiwuDB 受邀亮相山东省数字化转型论坛

KaiwuDB

数字化转型 KaiwuDB

Flink实现高效实时处理百万级数据:实践与优化

xfgg

flink 6 月 优质更文活动

HummerRisk获中国开源创新大赛优秀奖

HummerCloud

开源 云安全

赋能矿山 | KaiwuDB 智慧矿山解决方案

KaiwuDB

解决方案 智慧矿山 KaiwuDB

相约未名湖畔,百度商业AI技术创新大赛携手北大学子共探AI发展

百度Geek说

人工智能 百度 企业号 6 月 PK 榜

科兴未来|2023年扬中高层次人才创新创业大赛

科兴未来News

京东购物车分页方案探索和落地 | 京东云技术团队

京东科技开发者

京东云 京东商城 企业号 6 月 PK 榜 6 月 优质更文活动

想要更好地理解大模型架构?从计算参数量快速入手

Baihai IDP

人工智能 Transformer 大模型 白海科技 企业号 6 月 PK 榜

“敏捷教练进阶课程”7月22-23日 ·A-CSM认证在线周末班【提前报名特惠】CST导师亲授

ShineScrum捷行

敏捷教练

喜讯 | 华秋电子荣获证券时报年度高成长企业

华秋电子

架构师日记-从技术角度揭露电商大促备战的奥秘 | 京东云技术团队

京东科技开发者

京东云 企业号 6 月 PK 榜 京东618

【Netty】「萌新入门」(一)Hello, World!

sidiot

Java 后端 Netty 6 月 优质更文活动

微服务之负载均衡

Disaster

微服务

浪潮 KaiwuDB x 大数据中心 | 数据驱动政府治理能力快速提升

KaiwuDB

KaiwuDB 大数据中心建设

直播回顾 | 一体化智能可观测平台如何保障电商节大促

博睿数据

可观测性 智能运维 博睿数据 618 电商行业

“全球金牌课程”8月5-6日 · CSM认证在线周末班【提前报名特惠】CST导师亲授

ShineScrum捷行

敏捷教练 Scrum Master CSM 敏捷项目管理

短视频云端批量混剪实操指南

阿里云视频云

云计算 短视频 视频云 云剪辑

Cognito, OIDC 实现 S3 精细化权限控制_文化 & 方法_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章