写点什么

Cognito 身份池、Dynamodb 表和创建 Lambda 函数

  • 2019-10-09
  • 本文字数:2699 字

    阅读完需:约 9 分钟

Cognito 身份池、Dynamodb 表和创建 Lambda 函数

背景介绍

Amazon Cognito 为我们的 Web 和移动应用程序提供身份验证、授权和用户管理。它通过身份池可以把令牌转换成 AWS 的临时凭证,可用于访问其他 AWS 服务 (如 Amazon S3 或 Amazon DynamoDB)。因此为我们提供了一套灵活管理客户端访问 AWS 资源的验证授权机制。


除了可使用用户名和密码直接登录,Amazon Cognito 还可以通过第三方 (如 Facebook、Amazon 或 Google) 登录,从而便利了开发者使用主流社交网站的登录体系实现用户登录。Amazon Cognito 已经于 2017 年 11 月在由光环新网运营的 AWS 中国(北京)区域发布,AWS 官方尚未支持使用的微信登录,我们通过以下系列文章为大家介绍通过 Amazon Cognito 的开发人员验证的身份来变通实现微信登录。


要实现微信登录,需要先把微信开放平台注册并创建项目,具体请参考《移动应用微信登录开发指南》。


整体架构

App 客户端呼起微信进行验证,后端 API 与微信开放平台对接验证用户有效性,验证为有效的用户再从服务端调用 Amazon Cognito 服务获取 OpenIdToken,并通过后端 API 返回给 App 客户端。App 客户端再访问其它 AWS 服务时通过 AWS STS 用 OpenIdToken 换取临时凭证。在 Amazon Cognito 中配置的 IAM 角色来控制这个客户端可以访问哪些 AWS 服务。


这里的后端 API 使用现在流行的无服务器架构,以 AWS Lambda 实现简明的业务逻辑,以 API Gateway 实现对外的 API 接口,用 DynamoDB 表存储用户表,只不过这里的用户表中不是直接存储用户名和密码,而是改为存储用户的微信 openID 和自己网站的用户 userID 的对应关系。整个后端 API 架构简单明了,安全可靠,自动伸缩。

移动端 App 获取微信登录数据

根据整个业务逻辑的数据流,我们先来做移动端 App 开发,这里以安卓客户端为例。获得到微信登录验证用的 code 参数后,我们再去做后端验证的 API。最后再回到移动 App,集成 Amazon Cognito 授权来访问 AWS 资源。


创建 Android Studio 开发项目


Application Name 填写 CognitoWechat。


Company domain 填写aws.com


这样凑出的 Package name 是 com.aws.cognitowechat。


下一页选择 SDK 时选 API 21:Android 5.0 (Lollipop)。下一页添加 Activity 选择 Empty Activity。最后一页保持默认参数值创建一个空 Activity,点击 Finish。


项目创建成功后,我们打开 AndroidManifest.xml 文件,可以确认包名 package=”com.aws.cognitowechat”。这个值后续我们配置微信开放平台应用时需要用到。


以 keystore 签名构建安卓 App 后,再使用微信开放平台的签名生成工具生成签名,以这两个值去创建微信开放平台的应用。


获取微信登录第一步 code 值


创建微信平台应用以及安卓 App 接入微信登录的方法这里不再赘述。我们以一个简单的按钮呼起微信登录,验证通过后返回 App,在 onResume()方法里截获微信平台返回的 code 值。详细代码请见分享的源码。


https://github.com/xfsnow/android/blob/master/CognitoWechat/app/src/main/java/com/aws/cognitowechat/MainActivity.java


我们看一下主流程的截图。



点击按钮调用微信登录。



首次请求微信登录时会弹出用户授权页,以后再呼起微信就不会重复弹出了。



微信登录成功后,返回 code 值为我们自己的 App 截获。这里只是用 Toast.makeText()显示出来方便展示。我们也要 App 内记了日志,可以把这个 code 值保存下来,用于下面我们要开发的后端验证接口。

创建 AWS 资源

我们把实现这个范例相关的 AWS 资源逐步创建出来。


申请 API Gateway 的 API 通过互联网可访问


首次使用由西云数据运营的 AWS 中国(宁夏)区域和由光环新网运营的 AWS 中国(北京)区域的 API Gateway 时,需要申请开通互联网可以访问。否则仅在控制台测试 API 的方法时可以成功,但使用 HTTP 请求 API 时不能正常返回结果,只会返回{“Message”:null}这样的结果。申请方法是使用支持控制面板


https://console.amazonaws.cn/support/home?region=cn-north-1#/


点击创建案例按钮。


关于项保持默认的“账户和账单支持”。


服务选择“账户”。


类别选择“合规性和认证(ICP 备案)”。


主题输入“请开放 API Gateway 公网可访问”。


描述输入“我需要创建 API Gateway,请开放 API Gateway 公网可访问”。


案例需要支持服务人工处理,请耐心等待处理结果。等待期间我们可以继续下面的讲解和练习。


创建 Amazon Cognito 身份池


我们访问 https://console.amazonaws.cn/cognito/home?region=cn-north-1 打开 Amazon Cognito 控制台。点击页面正中的“管理身份池”按钮,然后点击“创建新的身份池”按钮。身份池名称栏输入 CognitoWechat。


点击“身份验证提供商”展开,选择“自定义”选项卡,开发人员提供商名称输入 cn.aws.cognitowechat。这个包名将用于我们后续开发的客户端程序和后端 API 程序,用以标记使用的是同一个身份池。


点击右下角“创建池”按钮。前进到 IAM 创建角色页,直接点击右下角“允许”按钮即可。


身份池创建成功后,会同时创建出 2 个 IAM 角色——Cognito_CognitoWechatAuth_Role 和 Cognito_CognitoWechatUnauth_Role。这个范例中我们模拟的场景是登录后的用户可以访问 Amazon S3,所以我们再给 Cognito_CognitoWechatAuth_Role 角色附加一个策略“AmazonS3ReadOnlyAccess”,最后在 Android 客户端允许通过 Cognito 授权的用户可以列出现有 Amazon S3 的桶名称。


创建 DynamoDb 表


我们使用一个 DynamoDb 表记录微信用户 UnionId 与我们自己用户体系中用户的对应关系。


具体创建和使用 DynamoDb 表,请参考相关文档。


http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.JsShell.01.html


在这个范例中我们全部使用由光环新网运营的 AWS 中国(北京)区域,所以在由光环新网运营的 AWS 中国(北京)区域创建一个表,表名叫 WechatUser。主分区键名称为 unionid ,使用字符串类型。

小结

这一篇中我们介绍了 Amazon Cognito 集成微信登录的整体架构,开始部署 Cognito 身份池和 DynamoDb 表。使用 Android Studio 创建了客户端 App,并且添加了微信登录的基本流程。在下一篇中,我们将继续为大家用 Eclipse 进行 Lambda 函数开发的相关内容。


作者介绍:


薛峰


亚马逊 AWS 解决方案架构师,AWS 的云计算方案架构的咨询和设计,同时致力于 AWS 云服务在国内和全球的应用和推广,在大规模并发应用架构、移动应用以及无服务器架构等方面有丰富的实践经验。在加入 AWS 之前曾长期从事互联网应用开发,先后在新浪、唯品会等公司担任架构师、技术总监等职位。对跨平台多终端的互联网应用架构和方案有深入的研究。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/amazon-cognito-wechat-deployment-1/


2019-10-09 18:20948
用户头像

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

关注

评论

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

数字黄金 vs 全球计算机:比特币与以太坊现货 ETF 对比

TechubNews

蓝易云 - Nacos启动常见报错解决方法

百度搜索:蓝易云

云计算 运维 nacos 服务器 云服务器

Qt(C++)绘制指针仪表盘显示当前温度

DS小龙哥

6 月 优质更文活动

TDengine 新能源行业研讨会上都说了啥?精彩回顾!

TDengine

数据库 tdengine 时序数据库

蓝易云 - 海外云主机的选择要注意什么?

百度搜索:蓝易云

云计算 运维 服务器 云主机 云服务器

【开发者推荐】告别繁琐:一键解锁国产ETL新贵,Kettle的终结者

敏捷调度TASKCTL

kettle 国产数据库 TASKCTL 数据集成平台

介绍几种 MySQL 官方高可用方案

Simon

MySQL 数据库 MySQL高可用

“逐代传承”提升强化学习效果;LLM重塑Multi-agent建模与仿真

算AI

深度学习 强化学习 NLP 大模型 #人工智能 LLM

三大国际产业与标准组织正式成立,引领全球产业创新与发展

最新动态

利用反射API和AOP实现业务逻辑的自动化重构

技术冰糖葫芦

API Explorer API boy api 货币化 API 文档

我的私人助理 | 办公小浣熊

六月的雨在InfoQ

数据分析 数据可视化 数据分析预测 办公小浣熊 莫比乌斯环

文献解读-基因编辑-第十二期|《CRISPR-detector:快速、准确地检测、可视化和注释基因组编辑事件引起的全基因组范围突变》

INSVAST

基因数据分析 生信服务 基因编辑

原生鸿蒙,激活数字内容一池活水

最新动态

未来LED显示屏方向:超薄、散热、柔性

Dylan

国际化 LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家

2024年中国零信任发展趋势展望

芯盾时代

iam 统一身份认证 零信任 零信任模型 sdp

KaiwuDB 事务中的 Raft 协议

KaiwuDB

数据一致性 raft协议 KaiwuDB

甲子光年专访天润融通CEO吴强:客户经营如何穿越低速周期?

天润融通

人工智呢

蓝易云 - npm install报错问题解决合集

百度搜索:蓝易云

云计算 运维 Node 云服务器 install

蓝易云 - 详解SpringBoot的常用注解

百度搜索:蓝易云

云计算 Linux 运维 springboot 云服务器

Apache Flink类型及序列化研读&生产应用|得物技术

得物技术

flink 技术分享 企业号2024年6月PK榜

通过搭建 24 点小游戏应用实战,带你了解 AppBuilder 的技术原理

百度Geek说

企业号 6 月 PK 榜 AI 原生云 AppBuilder

接口测试:Mock 工具与定制化

测试人

软件测试 Mock

天润融通"恶意感知系统":提前预警,化解315公关危机

天润融通

蓝易云 - 简单shell脚本的编写教程

百度搜索:蓝易云

Linux 运维 Shell 服务器 云服务器

mac苹果单机游戏推荐:古墓丽影11:暗影 for Mac安装包

你的猪会飞吗

Mac游戏下载 mac单机游戏

Markdown一键生成PPT!这2个AI工具软件值得推荐!

彭宏豪95

markdown PPT 在线白板 效率软件 AI生成PPT

深入理解Spring AOP中的@EnableAspectJAutoProxy

华为云开发者联盟

Java spring 华为云 华为云开发者联盟 企业号2024年6月PK榜

Cognito 身份池、Dynamodb 表和创建 Lambda 函数_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章