【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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:20842
用户头像

发布了 1837 篇内容, 共 92.7 次阅读, 收获喜欢 73 次。

关注

评论

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

JavaScript, ABAP 和 Scala 里的尾递归(Tail Recursion)

Jerry Wang

JavaScript 编程语言 尾递归 abap 11月月更

vue组件通信6种方式总结(常问知识点)

bb_xiaxia1998

Vue

通俗易懂的React事件系统工作原理

夏天的味道123

React

知识蒸馏相关技术【模型蒸馏、数据蒸馏】以ERNIE-Tiny为例

汀丶人工智能

nlp 知识蒸馏 11月月更

细说React组件性能优化

xiaofeng

React

技术分享 | 如何确保API 的稳定性与正确性?你只需要这一招

霍格沃兹测试开发学社

高频js笔试题看这一篇就够了

helloworld1024fd

JavaScript

数据中台的最后一公里:数据服务

元年技术洞察

数据中台 中台 DaaS

详解React的Transition工作原理原理

夏天的味道123

React

chrome调试工具之Elements

格斗家不爱在外太空沉思

浏览器 11月月更 elements

这可能是你需要的React实战技巧

夏天的味道123

React

从 0 开始学 Python 自动化测试开发(二):环境搭建

霍格沃兹测试开发学社

说说前端经常考的手写题

helloworld1024fd

JavaScript

Spring Boot 实现接口幂等性的 4 种方案

小小怪下士

Java spring springboot

React-Hook最佳实践

xiaofeng

React

Istio Ambient Mesh七层服务治理图文详解

华为云开发者联盟

云原生 后端 华为云 企业号十月 PK 榜

ReactDOM.render在react源码中执行之后发生了什么?

flyzz177

React

从零到一手写迷你版Vue

helloworld1024fd

JavaScript

chrome调试工具之Sources

格斗家不爱在外太空沉思

浏览器 浏览器测试 11月月更

华为云从入门到实战 | 云速建站服务与企业主机安全服务

TiAmo

华为 华为云 11月月更

校招面试真题 | 测试流程大概是什么?

霍格沃兹测试开发学社

一步步实现React-Hooks核心原理

helloworld1024fd

JavaScript

读懂React原理之调和与Fiber

xiaofeng

React

【LeetCode】二叉树最大宽度Java题解

Albert

算法 LeetCode 11月月更

CnosDB 2.0 产品发布会预告:一切为了万物智联,用 Rust 打造云原生时序数据库

CnosDB

时序数据库 开源社区 CnosDB CnosDB 2.0发布会

React源码解读之React Fiber

flyzz177

React

React Context源码是怎么实现的呢

flyzz177

React

chrome调试工具之Console

格斗家不爱在外太空沉思

浏览器 浏览器测试 11月月更

【愚公系列】2022年11月 微信小程序-日期时间组件封装

愚公搬代码

11月月更

工作多年,技术认知不足,个人成长慢,职业发展迷茫,该怎么办?

霍格沃兹测试开发学社

更轻量的百度百舸,CCE Stack 智算版发布

Baidu AICLOUD

AI工程化 高性能计算 异构计算 百度百舸

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