专栏首页ascii0x03的安全笔记让用户使用第三方账号(如亚马逊账号)接入AWS IoT系统

让用户使用第三方账号(如亚马逊账号)接入AWS IoT系统

我们想象这么一个IoT应用场景:厂商A使用AWS IoT来开发物联网解决方案,那么A把设备卖给用户的时候,需要使用户能够登入AWS IoT系统来控制其购买的A的设备,也就是说给用户分配适当的权限。下面本文简要概括讨论如何实现这样一个场景。

部分细节可以参考这个博客:https://blog.csdn.net/luo_bo1/article/details/84567988

1. 用户身份的管理

首先,用户必须有一个独特的身份在这个系统中。事实上,开发者甚至不需要自己维护一个管理身份的服务器,用户也不愿意注册那么多账号。为解决这个问题,便产生了直接使用第三方账号身份来映射到AWS IoT系统中的方法,也就是说,用户只要有一些公共的第三方身份提供商的账号(如谷歌、亚马逊等),便允许直接使用AWS IoT系统。本文使用了Login with Amazon这个第三方服务,厂商只要根据Login with Amazon的文档实现一个接口即可。主要有如下几步:

(1) 在developer.amazon.com后台注册一个OAuth的客户端,还要提供隐私策略,获得一个亚马逊发放的OAuth ClietID和Client Secret,这样亚马逊才能认证这是哪个开发者想获得用户的信息。在用户授权后,即可向亚马逊获得用户的基本身份信息。

(2)本人是用Web实现的,因此需要设置OAuth过程中需要的回调URL,并且把这个URL加入Login with Amazon的白名单。此外,还要在Web setting中设置Allow origin。在调用亚马逊这个接口时,亚马逊会验证ClientId,web URL来认证开发者的身份,并且有了origin也能防止这是别人在冒用你的ClientID(用户点击login with amazon的时候浏览器会携带origin发给亚马逊,尽管这个有时可以伪造);用户授权后,结果token会以重定向的方式让用户浏览器访问白名单中存在的回调URL,这样就确保只有开发者的服务器可以获得token,防止别人偷取。

(3)开发者获得了用户的token,就可以查询获得用户在Amazon的 信息,进而获得到一个唯一的用户ID。这个ID应该是唯一匿名化的身份标识,即不会泄露用户的信息,不同Client获得的也不一样,防止用户被追踪。

2. 给对应用户分配适当的权限

现在我们获得了用户的身份,但是用户要访问的是AWS IoT中的资源,如何设置才能将AWS中的权限,关联至第三方身份提供商给的身份呢?这就需要AWS Cognito的Identity Pool出马了。

(1)首先,cognito需要验证用户的身份,然后在Identity Pool中创建一个对应的身份映射。这首先需要在cognito的Identity Pool中设置Authentication providers,添加开发者创建的login with amazon的标识,即Amazon App ID。这样,开发者只要给cognito结点发送获得到的用户token,cognito就可以与身份提供商交互来验证该token是否有效;若有效,会创建一个cognito ID来标识该第三方身份的用户,这个cognito ID与该用户的第三方身份应该是绑定的。

(2)开发者获得用户第三方token后,向cognito发送该token,就表明了该用户身份,cognito会再返回给程序一系列cognito的token。由于用户cognito就是AWS自己的服务,所以可以关联AWS IoT中的权限给该用户使用。具体动态关联的方法没有深究,只是用aws cli简单测试实现,正确动态做法可以参考官方PPT:https://www.slideshare.net/AmazonWebServices/iot-apps-with-aws-iot-and-websockets

aws cli使用需要先设置, 可以参考https://razeencheng.com/post/tool-awscli-overview-1

指令有点坑,记录一下:

aws iot  attach-policy --policy-name <value> --target <value>

(3)最后强调一点,策略设置时要注意权限的控制,AWS提供了策略变量来获得用户特有的不变凭证,参考https://blog.csdn.net/luo_bo1/article/details/84567988即可。另外设置的时候有点坑,既要设置认证过cognito用户的粗粒度权限,又要在AWS IoT中设置细粒度的权限并且关联到cognito用户上。

3.附录JS代码

注:必须自己搭建个web服务器来测试,否则由于浏览器安全限制(好像是专门本地的文件)无法使用亚马逊的js API。推荐XAMPP,起名成html直接放到htdoc下就好了,xampp还直接支持https。

 1 <!doctype html>
 2 <html lang="en_US">
 3 
 4 <head>
 5     <script src="https://sdk.amazonaws.com/js/aws-sdk-2.451.0.min.js"></script>
 6 </head>
 7 
 8 <body>
 9     <a href id="LoginWithAmazon">
10         <img border="0" alt="Login with Amazon"
11             src="https://images-na.ssl-images-amazon.com/images/G/01/lwa/btnLWA_gold_156x32.png" width="156"
12             height="32" />
13     </a>
14     <button onclick="myFunction()">Myfunction</button>
15 
16     <div id="amazon-root"></div>
17     <script type="text/javascript">
18 
19         window.onAmazonLoginReady = function () {
20             amazon.Login.setClientId('amzn1.application-oa2-client.XXXXX');
21         };
22         (function (d) {
23             var a = d.createElement('script'); a.type = 'text/javascript';
24             a.async = true; a.id = 'amazon-login-sdk';
25             a.src = 'https://assets.loginwithamazon.com/sdk/na/login1.js';
26             d.getElementById('amazon-root').appendChild(a);
27         })(document);
28     </script>
29 
30     <script type="text/javascript">
31         document.getElementById('LoginWithAmazon').onclick = function () {
32             options = { scope: 'profile' };
33             amazon.Login.authorize(options,
34                 'https://127.0.0.1/test.html');
35             return false;
36         };
37     </script>
38 
39     <script>
40         function myFunction() {
41             // Set the region where your identity pool exists (us-east-1, eu-west-1)
42             AWS.config.region = 'us-east-1';
43 
44             // Configure the credentials provider to use your identity pool
45             AWS.config.credentials = new AWS.CognitoIdentityCredentials({
46                 IdentityPoolId: 'us-east-1:d9fe3941-df89-4190-ab80-XXXXX',
47                 Logins: { // optional tokens, used for authenticated login
48                     'www.amazon.com': '第三方登陆获得的token'
49                 }
50             });
51 //检查获得的用户token是否有效https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza%7CIwEBINapjp9vq3UgptE95f5fqL4DQ5K57Ex5tWTLh0D6K3-omYt8N2H_D-H8tDnn9fyqkrbZ0HdrnQJ4F2_-VtMVB5IOM5quEqr8qZCVVOswPKBHYnL5VwZ4YXtWJiqkssPlsvygcSD74lJWJlAVGTewHP9HWAR4HL4kADPJIyKxI2i_BWpGrDpQb6nw5Yeh6VbtTG9zTWpZUfZsENpkoMo6K5m0H-rw_NmiiZxIBsaOgtIlYTTcG5qKcRFevPXk8SQ8BZKRmXd5Hx2M1bld4rInXLfR41OvuTXH1GKXJHVKMc2hvGt6sMOCcqAXw2ABKAciYAQ1X9uV-RD5zWcp02bw7fgKr8IgwmORyHUhLnnwY8FRYTUQQcTlNHsHVzsbSQ7FYZn7IST9O7nKiSyUryh3VJyCnEqyyvpDzIhSjNjPIyIprpKZoZL1iVKH0oLL_4slT79DVAmuOsUjUKjXnWHbImrF0ZZissrfHPCE2708RWwu-ZgpSsmhPqgRpgE-TlX803ziNo2kvazKpdPg6O6MGG7H2yV8PUW-zwVXO1XxJTK4Nw
52            
53             // Make the call to obtain credentials
54             AWS.config.credentials.get(function () {
55                 // Credentials will be available when this function is called.
56                 var accessKeyId = AWS.config.credentials.accessKeyId;
57                 var secretAccessKey = AWS.config.credentials.secretAccessKey;
58                 var sessionToken = AWS.config.credentials.sessionToken;
59                 var identityId = AWS.config.credentials.identityId;
60                 console.log(accessKeyId);
61                 console.log(secretAccessKey);
62                 console.log(sessionToken);
63                 console.log(identityId);
64                 
65             });
66         }
67     </script>
68 
69 
70 </html>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从物联网设备生命周期理解Apple Homekit框架

    本次笔记主要基于苹果公开的HomeKit Accessory Protocol协议文档和IOS Security Guide中相关部分。

    ascii0x03
  • MQTT开源代理Mosquitto源码分析(访问控制篇)

    从GitHub下载源码后,代理的源码在src中,同时还用到了lib库中的一些函数。对项目的工作流程有个大概理解是分析mosquitto的访问控制权限的基础,网络...

    ascii0x03
  • 使用mitmproxy嗅探双向认证ssl链接——嗅探AWS IoT SDK的mqtts

    亚马逊AWS IoT使用MQTTS(在TLS上的MQTT)来提供物联网设备与云平台直接的通信功能。出于安全考虑,建议给每个设备配备了证书来认证,同时,设备也要安...

    ascii0x03
  • NSIS 打包脚本基础

    简介 NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、...

    静默虚空
  • IE打开https网站localhost时,取消证书问题提示

    上面介绍了,调用IE来打开对应的网页问题,但是在实际测试中,有些网站是采用https协议的,这时候IE浏览器会弹出如下窗口,一般手动选择后,才可进入登录界面,那...

    跟着阿笨一起玩NET
  • 如何在CentOS上创建Sudo用户[快速入门]

    该sudo命令提供了一种机制,用于向普通用户授予通常仅对root用户可用的管理员权限。本教程将向您展示在CentOS上创建具有sudo访问权限的新用户的最简单方...

    小皇帝James
  • 如何在Ubuntu上创建Sudo用户[快速入门]

    该sudo命令提供了一种机制,用于向普通用户授予通常仅对root用户可用的管理员权限。本指南将向您展示在Ubuntu上创建具有sudo访问权限的新用户的最简单方...

    吴凌云
  • 人工智能在天体物理中的应用

    编者按:从人类诞生的那一刻起,人们对宇宙奥秘的求索就从未停止。今天,天文学已经进入了一个具有多波段、多信使的海量观测数据的黄金时期,人工智能技术将对天文领域产生...

    AI科技评论
  • Linux中配置Java开发环境

    rpm是管理套件命令,-qa表示使用询问模式查询所有套件;grep表示查询文件里符合条件的字符串;java表示查询包含java的字符串

    老九学堂-小师弟
  • 为测试者布道,腾讯互娱总监魏学峰分享手游研测干货

    由专注移动互联网测试技术的垂直社区Testerhome,主办的第三届Mobile Testing Summit China中国移动互联网测试开发大会7月15日在...

    WeTest质量开放平台团队

扫码关注云+社区

领取腾讯云代金券