我们想象这么一个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。

 <!doctype html>
<html lang="en_US"> <head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.451.0.min.js"></script>
</head> <body>
<a href id="LoginWithAmazon">
<img border="0" alt="Login with Amazon"
src="https://images-na.ssl-images-amazon.com/images/G/01/lwa/btnLWA_gold_156x32.png" width="156"
height="32" />
</a>
<button onclick="myFunction()">Myfunction</button> <div id="amazon-root"></div>
<script type="text/javascript"> window.onAmazonLoginReady = function () {
amazon.Login.setClientId('amzn1.application-oa2-client.XXXXX');
};
(function (d) {
var a = d.createElement('script'); a.type = 'text/javascript';
a.async = true; a.id = 'amazon-login-sdk';
a.src = 'https://assets.loginwithamazon.com/sdk/na/login1.js';
d.getElementById('amazon-root').appendChild(a);
})(document);
</script> <script type="text/javascript">
document.getElementById('LoginWithAmazon').onclick = function () {
options = { scope: 'profile' };
amazon.Login.authorize(options,
'https://127.0.0.1/test.html');
return false;
};
</script> <script>
function myFunction() {
// Set the region where your identity pool exists (us-east-1, eu-west-1)
AWS.config.region = 'us-east-1'; // Configure the credentials provider to use your identity pool
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:d9fe3941-df89-4190-ab80-XXXXX',
Logins: { // optional tokens, used for authenticated login
'www.amazon.com': '第三方登陆获得的token'
}
});
//检查获得的用户token是否有效https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza%7CIwEBINapjp9vq3UgptE95f5fqL4DQ5K57Ex5tWTLh0D6K3-omYt8N2H_D-H8tDnn9fyqkrbZ0HdrnQJ4F2_-VtMVB5IOM5quEqr8qZCVVOswPKBHYnL5VwZ4YXtWJiqkssPlsvygcSD74lJWJlAVGTewHP9HWAR4HL4kADPJIyKxI2i_BWpGrDpQb6nw5Yeh6VbtTG9zTWpZUfZsENpkoMo6K5m0H-rw_NmiiZxIBsaOgtIlYTTcG5qKcRFevPXk8SQ8BZKRmXd5Hx2M1bld4rInXLfR41OvuTXH1GKXJHVKMc2hvGt6sMOCcqAXw2ABKAciYAQ1X9uV-RD5zWcp02bw7fgKr8IgwmORyHUhLnnwY8FRYTUQQcTlNHsHVzsbSQ7FYZn7IST9O7nKiSyUryh3VJyCnEqyyvpDzIhSjNjPIyIprpKZoZL1iVKH0oLL_4slT79DVAmuOsUjUKjXnWHbImrF0ZZissrfHPCE2708RWwu-ZgpSsmhPqgRpgE-TlX803ziNo2kvazKpdPg6O6MGG7H2yV8PUW-zwVXO1XxJTK4Nw // Make the call to obtain credentials
AWS.config.credentials.get(function () {
// Credentials will be available when this function is called.
var accessKeyId = AWS.config.credentials.accessKeyId;
var secretAccessKey = AWS.config.credentials.secretAccessKey;
var sessionToken = AWS.config.credentials.sessionToken;
var identityId = AWS.config.credentials.identityId;
console.log(accessKeyId);
console.log(secretAccessKey);
console.log(sessionToken);
console.log(identityId); });
}
</script> </html>

让用户使用第三方账号(如亚马逊账号)接入AWS IoT系统的更多相关文章

  1. 在亚马逊amazon的AWS上安装Node和MongoDB服务器

    在亚马逊amazon的AWS上安装Node和MongoDB服务器 在建立AWS上账号.创建EC2 ,用putty链接上之后,就可以用下面的方法开始安装. !!! 如果不是是自己建立的EC2, 而是由B ...

  2. 亚马逊云服务器AWS安装CentOS

    亚马逊云服务器默认创建的实例,在停止之后再启动的情况下,IP会发生改变.所以我们最好先创建一个弹性IP,即EIP,不过我也不清楚这个费用. 1.按如图操作创建一个弹性IP,弹性IP创建之后可以随便绑定 ...

  3. Authenticator App 两步验证会不会造成亚马逊账号关联?

    今天听人说,因为用Authenticator App做亚马逊两步验证造成了帐号关联…… 我给大家解释一下Authenticator的实现原理,作为计算机专业科班出身的我,此次从各方面了解并经过自己亲测 ...

  4. [ PHP+jQuery ] ajax 多级联动菜单的应用:电商网站的用户地址选择功能 ( 二 ) - 仿亚马逊下拉面板

    /** jQuery version: 1.8.3 Author: 小dee Date: 2014.11.8 */ 接上一篇博客. 实现带缓存的仿亚马逊下拉面板 效果图: 图1 初始 图2 点击省份 ...

  5. 亚马逊云VPS AWS更改LINUX为ROOT权限密码登陆

    LINUX VPS没有ROOT权限是很难受的事,并且密码登陆也方便一些.首先用AWS证书验证的账户登录,1.修改ROOT密码sudo passwd root2.sudo chmod 777 /etc/ ...

  6. 亚马逊VE账号运营

    VE劲爆内幕大揭秘!“仿牌+Amazon VE”跟卖之路 Amazon Vendor Express 是Amazon.com2015年下旬推出的新的供应商平台,商家通过这个平台可以把产品卖给Amazo ...

  7. 亚马逊MWS开发套路演示

    MWS是商城网络服务的缩写,具体介绍看这里http://docs.developer.amazonservices.com/zh_CN/dev_guide/DG_IfNew.html.MWS就是一组A ...

  8. [转]Amazon AWS亚马逊云服务免费一年VPS主机成功申请和使用方法

    今天部落将再次为大家介绍如何成功申请到来自亚马逊的Amazon AWS免费一年的VPS主机服务.亚马逊公司这个就不用介绍了,是美国最大的一家网络电子商务公司,亚马逊弹性计算云Amazon EC2更是鼎 ...

  9. RBC:Echo设备2020年可为亚马逊贡献100亿美元收入

    BI 中文站 12 月 22 日报道 加拿大皇家银行资本市场(RBC Capital Markets)分析师马克-马哈尼(Mark Mahaney)表示,亚马逊是首批将智能音箱引进主流受众的公司之一, ...

随机推荐

  1. 【u009】瑞瑞的木板

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每 ...

  2. JAVA生成二维码并转化为二进制在页面展示

    引用jar包: zxing的core包,下载路径可参考:http://download.csdn.net/detail/sxg0205/9461106 java代码: 引用包: import java ...

  3. PHP的SPL标准库里面的堆(SplHeap)怎么使用

    PHP的SPL标准库里面的堆(SplHeap)怎么使用 一.总结 1.因为SplHeap是抽象类,所以要先继承,实现里面的抽象方法compare后,才能new对象使用. 二.PHP的SPL标准库里面的 ...

  4. JVM源码系列:ThreadMXBean 打出堆栈信息原理分析

    我们通常会使用工具jstack 去跟踪线程信息,其如何实现使用attach 的方式还是ptrace 的方式,这些可以去参考本人的博客的其他文章. 但这些方式都是外部使用的方式,如何直接使用java代码 ...

  5. oracle 内存结构具体解释

    Oracle 内存结构 与 Oracle 实例关联的基本内存结构包含: 系统全局区 (SGA):由全部server和后台进程共享.SGA 中存储的数据演示样例包含快速缓存的数据块和共享 SQL 区域. ...

  6. 【t087】公共汽车

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 路人丁成为了一名新公交车司机,每个司机都有一张牌子,牌子的正面写了拥有这个牌子的司机开的线路号,另外一 ...

  7. Zepto.js touch,tap增加 touch模块深入分析

    1. touch库实现了什么和引入背景 click事件在移动端上会有 300ms 的延迟,同时因为需要 长按 , 双触击 等富交互,所以我们通常都会引入类似 zepto 这样的库.zepto 中tou ...

  8. 【26.09%】【codeforces 579C】A Problem about Polyline

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. Atititjs javascript异常处理机制java异常转换.js exception process

    Atititjs javascript异常处理机制java异常的转换.js exception process 1. javascript异常处理机制 Throw str Not throw erro ...

  10. Vue 兄弟组件之间传递数值

    Vue 兄弟组件之间传值 创建一个公用文件夹,在文件夹中设置一个事件处理中心,即 然后在需要设置值的组件中引入该事件处理中心 import Hub from '../../common/eventHu ...