AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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

发布了 1871 篇内容, 共 134.5 次阅读, 收获喜欢 81 次。

关注

评论

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

Go 语言 select 都能做什么?

AlwaysBeta

Go golang 面试 select

搜狐科技专访 | 澜舟科技CEO周明:不过度追求AGI,更看重大模型语言理解能力和应用落地性

澜舟孟子开源社区

自然对话语音开启人机交互的未来之窗

数据堂

车内语音识别数据:驾驶体验升级与智能出行的未来

数据堂

对线面试官-线程池连环问

派大星

线程池工作原理 Java 面试题

想学Python高级编程?这个技巧你不能错过!

程序员晚枫

Python 高级编程

直播网站源码社区功能部署开发:连接世界的互动形式!

山东布谷科技

软件开发 社区 源码搭建 直播网站源码 直播网站

浅析嵌入式GUI框架-LVGL

巫山老妖

嵌入式开发 LVGL FrameBuffer

3DCAT实时云渲染助力VR虚拟现实迈向成熟

3DCAT实时渲染

实时渲染云 VR虚拟现实

数据驱动的项目管理:未来趋势

乐思项目管理

#数据分析 #项目管理

自然对话语音数据:人机交互的新纪元与挑战

数据堂

javascript数据类型详解

timerring

JavaScript

Java教学之空指针异常、构造方法、封装

java易二三

Java 编程 程序员 计算机

腾讯会议搭桥铺路

B Impact

如何进行高效的代码审查

小万哥

程序员 程序人生 后端 软件开发 代码审查

文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题

福大大架构师每日一题

福大大架构师每日一题

如何配置 Sublime Text4为 C++ 编辑器

芯动大师

PoseiSwap 即将开启质押,利好刺激下 POSE通证短时涨超 30%

鳄鱼视界

JavaScript入门基础

timerring

JavaScript

精益思维在项目管理中的应用

乐思项目管理

项目管理 精益

最高1000万元基金直投!2023年中国(宁波)创新创业大赛

科兴未来News

Servlet学习:监听器、过滤器

java易二三

编程 程序员 计算机

代码随想录 Day27 - 回溯(三)

jjn0703

为什么我强烈建议大家使用枚举来实现单例

java易二三

编程 程序员 计算机 枚举

Spring系列之HikariCP连接池

java易二三

编程 程序员 Spring Boot 计算机 spring类型转换

项目管理中的'右转必停'原则:慎重决策与风险管理

乐思项目管理

项目管理 #观察生活

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