亚马逊AWS官方博客

Amazon Cognito 集成微信登录部署系列(一)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函数开发的相关内容。

索引

Amazon Cognito 集成微信登录部署系列(一)Cognito身份池、Dynamodb表和创建Lambda函数
Amazon Cognito 集成微信登录部署系列(二)用Lambda开发服务端API
Amazon Cognito 集成微信登录部署系列(三)与 API Gateway 集成、处理输入参数、返回响应结果
Amazon Cognito 集成微信登录部署系列(四)实现验证逻辑、发布 API
Amazon Cognito 集成微信登录部署系列(五)客户端集成 Cognito 验证

本篇作者

薛峰

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