写点什么

客户端集成 Cognito 验证

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

    阅读完需:约 13 分钟

客户端集成 Cognito 验证

在上一篇中我们实现了对接微信开放平台验证微信用户的业务逻辑,并调试通了 Lambda 函数和 API Gateway。在本篇中,我们将最终完成 Android 客户端,实现授权并访问 AWS 资源。

API Gateway 部署 API

最后我们把这个 API 发布出来。在 API 控制台点击操作按钮,选择部署 API,首次部署,我们在部署阶段下拉菜单选择[新阶段],阶段名称输入“test”,点击部署按钮即可。然后会跳转到“test 阶段编辑器”。可以看到显示调用 URL 类似 https://1234567890.execute-api.cn-north-1.amazonaws.com.cn/test。因为这个方法是 POST 方式提交,所以我们可以用 curl 命令行方式测试一下。


$ curl -d'{"code":"001YYVIG19Qt700dmWHG1nDUIG1YYVI7"}' 'https://1234567890.execute-api.cn-north-1.amazonaws.com.cn/test/loginwechat'
{"identityId":"cn-north-1:12345678-1234-4ba8-a97f-19948a5e422a","userId":123,"openIdToken":"eyJraWQiOiJjbi1ub3J0aC0xMiIsInR5cCI6IkpXUyIsImFsZyI6IlJTNTEyIn0.eyJzdWIiOiJjbi1ub3J0aC0xOmQ0YzIxZDkwLWE2YjEtNGJhOC1hOTdmLTE5OTQ4YTVlNDIyYSIsImF1ZCI6ImNuLW5vcnRoLTE6Y2M3YTQ0NWEtNWZhMS00OGM4LTkwYmUtNDAyYjI1ZmRlMDViIiwiYW1yIjpbImF1dGhlbnRpY2F0ZWQiLCJjbi5hd3MuY29nbml0b3dlY2hhdCIsImNuLmF3cy5jb2duaXRvd2VjaGF0OmNuLW5vcnRoLTE6Y2M3YTQ0NWEtNWZhMS00OGM4LTkwYmUtNDAyYjI1ZmRlMDViOjEyMyJdLCJpc3MiOiJodHRwczovL2NvZ25pdG8taWRlbnRpdHkuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuIiwiZXhwIjoxNTQ2MDc2NzM1LCJpYXQiOjE1NDYwNjY3MzR9.RTKre1SvI-NMKBwsfV0J2Z6WF0YVE1WdUhbzu_lPFmrtYbG__wC93zmR5OnpFouJHgeKBJC4abhvdxYltUdy7ltuK9YjHNDVVjx9IDdnLOt2kG3BUkzNQOAx9neyWOhomGM_XeiaaIbAR6EeMjTIMxl2Lyz13sFwuYSeulgBCeSDew27O-a0KNRLu2NVhOMA8-sZiXYVpdu5XqRMtJrC4FyResxTfeAS-arjrbc-A3NR_-70FCLze-Aaz9Bz0UeC7rskDvAdih-zDqxSh7LzdZz7lK4TS6AHui22fOFKjYsP1vOdvaOMhhX0_yIzVlqes-f4YnwO5ASWx8AOOEF6iA","status":"true"}
复制代码


可以看到,可以得到正常的返回结果。

API Gateway 生成客户端 SDK 包

点开“SDK 生成”选项页,在平台选“Android”。下面展开的内容,都和我们正在开发的 Android App 包名有关,我们前面已经定好包名为 com.aws.cognitowechat。相应的这里几项这样填写:


Group ID 填写 com.aws


Invoker package 填写完整包名 com.aws.cognitowechat


Artifact ID 填写 cognitowechat


Artifact version 填写自己编排的版本号,比如 1.0.0。


然后点击 Generate SDK 按钮,弹出下载文件对话框,保存到本机即可。

Android 客户端集成 Amazon Cognito 验证

我们打开 Android Studio,在 AndroidManifest.xml 中添加访问 Internet 权限。


 <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
复制代码


在 build.gradle 中的 dependencies 段加上如下引用。


implementation 'com.amazonaws:aws-android-sdk-core:2.9.0'
implementation 'com.amazonaws:aws-android-sdk-apigateway-core:2.9.0'
implementation 'com.amazonaws:aws-android-sdk-cognito:2.9.0'
implementation 'com.amazonaws:aws-android-sdk-cognitoauth:2.9.0'
implementation 'com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.9.0'
implementation 'com.amazonaws:aws-android-sdk-s3:2.9.0'
复制代码


这些是调用 API Gateway 和 Amazon Cognito 所需要的 AWS SDK,重新构建一下即可。


前面下载的 API Gateway 的 SDK 是一个 ZIP 压缩包,我们解压只提取其中以下几个文件:


CognitoWechatClient.java


model/AuthenticationRequestModel.java


model/AuthenticationResponseModel.java


把解压出来的 3 个文件复制粘贴到 com.aws.cognitowechat 包中。


我们回顾本系列第一篇的讲解,在 Android App 中访问 AWS 资源实际是通过 Amazon Cognito 的开发人员验证的身份,所以核心的代码就是实现一个 DeveloperAuthenticationProvider,然后以它的实例作参数初始化调用 AWS 资源的客户端类,如


DeveloperAuthenticationProvider developerProvider = new DeveloperAuthenticationProvider        (null, COGNITO_POOL_ID, getApplicationContext(), REGION);CognitoCredentialsProvider credentialsProvider = new CognitoCredentialsProvider(developerProvider, REGION);AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
复制代码


我们先实现这个 DeveloperAuthenticationProvider 类。详细源码请见后附源码库。主要注意以下几点:


// 这里写上和我们在 Cognito 身份池中设定的开发人员提供商名称。


private static final String developerProvider = “cn.aws.cognitowechat”;


必须实现的 refresh()和 getIdentityId()方法不能接收参数,而我们要调用后端 API 接口时还要传递微信登录验证需要的 code 参数,所以我们做了一个类的属性值,用于传递这个 code 参数值。


public DeveloperAuthenticationProvider(String accountId, String identityPoolId, Context context, Regions region, String code) {    super(accountId, identityPoolId, region);    // 把调用 API Gateway 相关的客户端初始化出来    AWSCredentialsProvider apiCredentialsProvider = new CognitoCachingCredentialsProvider(context, identityPoolId, region);    // 使用中国的区域时 ApiClientFactory
复制代码


不能自动识别出区域来,需要自己再用 region() 方法指定一下


    ApiClientFactory factory = new ApiClientFactory().region(MainActivity.REGION.getName()).credentialsProvider(apiCredentialsProvider);    Log.d(TAG, "DeveloperAuthenticationProvider: code="+code);    this.apiClient = factory.build(CognitoWechatClient.class);    this.code = code;}
复制代码


然后在实现的 refresh()方法中调用我们已经实现了微信登录逻辑的后端 API。


public String refresh() {    // Override the existing token    setToken(null);
AuthenticationRequestModel authRequest = new AuthenticationRequestModel(); authRequest.setCode(code); AuthenticationResponseModel authResponse = apiClient.loginwxPost(authRequest); Log.d(TAG, "refresh: userid=" + authResponse.getUserId() + " IdentityId= " + authResponse.getIdentityId() + " OpenIdToken=" + authResponse.getOpenIdToken()); identityId = authResponse.getIdentityId(); String token = authResponse.getOpenIdToken();
update(identityId, token); return token;
}
复制代码


最后回到 MainActivity.java,把前述授权访问 AWS 资源的代码加入到 onResume() 方法获得微信登录的 code 参数后面就完成了整个示例。


DeveloperAuthenticationProvider developerProvider = new DeveloperAuthenticationProvider
(null, COGNITO_POOL_ID, getApplicationContext(), REGION, WX_CODE);
CognitoCredentialsProvider credentialsProvider = new CognitoCredentialsProvider(developerProvider, REGION);
AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
// BJS 区需要特别指定一下 region 参数
s3.setRegion(Region.getRegion(REGION));
// 我们以列出S3桶名称来演示已获得S3只读权限
List<Bucket> bucketList = s3.listBuckets();
StringBuilder bucketNameList = new StringBuilder("My S3 buckets are:\n");
for (Bucket bucket : bucketList) {
bucketNameList.append(bucket.getName()).append("\n");
}
setHint(txtHint, "Login succeeded.\n" + bucketNameList);
复制代码


测试执行,可以看到列出了我自己的 Amazon S3 桶名称。


小结

这一篇中我们最终完成了 Android App 集成 Amazon Cognito 开发者身份验证,实现了授权并访问 AWS 资源。


相关文章:


AWS Toolkit for Eclipse


https://aws.amazon.com/eclipse/


API Gateway 的 Android SDK 使用详解


https://aws.amazon.com/cn/blogs/china/api-gateway-android-sdk/


Amazon Cognito 经过开发人员验证的身份 (身份池)


https://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/developer-authenticated-identities.html


源码链接


后端 API 源码


https://github.com/xfsnow/serverless/tree/master/CognitoWechat


Android 客户端源码


https://github.com/xfsnow/android/tree/master/CognitoWechat


索引


Amazon Cognito 集成微信登录部署系列(一)Cognito 身份池、Dynamodb 表和创建 Lambda 函数


Amazon Cognito 集成微信登录部署系列(二)用 Lambda 开发服务端 API


Amazon Cognito 集成微信登录部署系列(三)与 API Gateway 集成、处理输入参数、返回响应结果


Amazon Cognito 集成微信登录部署系列(四)实现验证逻辑、发布 API


Amazon Cognito 集成微信登录部署系列(五)客户端集成 Cognito 验证


作者介绍:


薛峰


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


本文转载自 AWS 技术博客。


原文链接:


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


2019-10-09 14:221022
用户头像

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

关注

评论

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

天翼云亮相操作系统大会&openEuler Summit 2023,斩获多项大奖!

天翼云开发者社区

云计算 大数据

一文详解动态 Schema

Zilliz

数据库 Milvus shema

K8S学习指南(1)-docker的安装

俞兆鹏

通过聚道云软件连接器实现金蝶软件与客如云软件的无缝对接

聚道云软件连接器

案例分享

软件测试/测试开发/全日制 | Python全栈开发实战:构建完整的Web应用

测吧(北京)科技有限公司

测试

程序员真是越来越懒了,Api 文档都懒得写?程序员:Api工具惯的!

不在线第一只蜗牛

一图回顾 Apache IoTDB 的 2023!

Apache IoTDB

软件测试/测试开发/全日制|Pytest都有哪些命名规则?

霍格沃兹测试开发学社

软件测试/测试开发/全日制|pytest用例执行顺序,这篇文章就够了

霍格沃兹测试开发学社

数据驱动运营?试试这款开源工具做可视化分析!

ClkLog

征程万里,行则将至|博睿数据2023年度盘点

博睿数据

软件测试/测试开发/全日制|Pytest参数化神器,pytest.mark.parametrize()使用

霍格沃兹测试开发学社

软件测试/测试开发/全日制 | 前后端协同工作:Python全栈开发的团队合作实践

测吧(北京)科技有限公司

测试

感恩有你|一起见证 OpenTiny 这5个锦鲤时刻

OpenTiny社区

开源 前端 低代码 组件库

中国电信天翼云全国产化大数据平台落地广西!

天翼云开发者社区

云计算 大数据 云平台

6本报告,助你2024招聘「才」源滚滚!

用友BIP

智能招聘

Scrum敏捷研发管理流程及示例

顿顿顿

Scrum 敏捷开发 Scrum Master 敏捷项目管理 敏捷研发管理工具

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致?(幸运池玩法)

石头财经

程序性能优化全能手册

快乐非自愿限量之名

php 性能优化

TuGraph Analytics作业监控面板:运行时组件上的高效分析工具

TuGraphAnalytics

分布式 监控 图计算

聚道云软件连接器助力某动漫行业公司实现财务自动化

聚道云软件连接器

案例分享

购买体育赛事直播系统源码,如何避免知识产权侵权和其它法律风险

软件开发-梦幻运营部

演讲实录|博睿数据副总裁杨雪松:可观测性建设之路(上)

博睿数据

加入openEuler训练营,一起探索开源世界的无限可能!

科技热闻

数字藏品如何赋能线下实体?以 BOOMSHAKE 潮流夜店为例

Footprint Analytics

NFT 数字藏品

K8S学习指南(2)-docker的基本使用

俞兆鹏

龙蜥操作系统上玩转铜锁密码库

OpenAnolis小助手

阿里云 操作系统 国密 龙蜥社区 铜锁

物联网与低代码: 连接人与数字世界的无限可能

不在线第一只蜗牛

低代码 物联网

MegEngine 11-12 双月报:新版本发布,开发者福利课程,MegEngine 使用技巧,精彩不容错过!

MegEngineBot

深度学习 开源 框架 寒武纪

K8S学习指南(3)-minikube的安装

俞兆鹏

恭喜 Databend 上榜 2023 开源创新榜「优秀开源项目 」

Databend

客户端集成 Cognito 验证_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章