AWS设备自定义身份认证

news/2024/11/8 16:39:00/

AWS设备自定义身份认证需要通过lambda服务实现,具体来说,首先需要创建一个lambda函数,在函数中实现具体的认证逻辑,然后Iot在调用授权方时,将触发lambda函数,返回认证结果。

1.输入参数说明

授权方在调用lambda函数时,将传递相关的参数信息,具体内容如下所示:

{"token" :"aToken","signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature."protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request."protocolData": {"tls" : {"serverName": "serverName" // The server name indication (SNI) host_name string.},"http": {"headers": {"#{name}": "#{value}"},"queryString": "?#{name}=#{value}"},"mqtt": {"username": "myUserName","password": "myPassword", // A base64-encoded string."clientId": "myClientId" // Included in the event only when the device sends the value.}},"connectionMetadata": {"id": UUID // The connection ID. You can use this for logging.},
}

2.创建lambda函数

操作地址:函数 – Lambda (amazonaws.cn)

编写函数逻辑:

如果检测到用户密码为test,则认证通过,并附加允许策略,其他情况,则附加拒绝策略。

console.log('Loading function');exports.handler = function(event, context, callback) { var uname = event.protocolData.mqtt.username;var pwd = event.protocolData.mqtt.password;var buff = Buffer.from(pwd, 'base64');var passwd = buff.toString('ascii');console.log(passwd);switch (passwd) { case 'test': callback(null, generateAuthResponse(passwd, 'Allow')); default: callback(null, generateAuthResponse(passwd, 'Deny'));  }
};// Helper function to generate the authorization response.
var generateAuthResponse = function(token, effect) { console.log(effect);var authResponse = {}; authResponse.isAuthenticated = true; authResponse.principalId = 'TEST123'; var policyDocument = {}; policyDocument.Version = '2012-10-17'; policyDocument.Statement = []; var publishStatement = {}; var connectStatement = {};connectStatement.Action = ["iot:Connect"];connectStatement.Effect = effect;connectStatement.Resource = ["arn:aws:iot:cn-northwest-1:xxxxxx:client/*"];publishStatement.Action = ["iot:Publish"]; publishStatement.Effect = effect; publishStatement.Resource = ["arn:aws:iot:cn-northwest-1:xxxxxx:topic/test/battery"]; policyDocument.Statement[0] = connectStatement;policyDocument.Statement[1] = publishStatement; authResponse.policyDocuments = [policyDocument]; authResponse.disconnectAfterInSeconds = 3600; authResponse.refreshAfterInSeconds = 300;return authResponse; 
}

3.创建授权方

通过aws cli命令行工具创建授权方,或者在Iot Core控制台直接创建授权方,

aws iot create-authorizer --authorizer-name TestAuthorizer --authorizer-function-arn arn:aws-cn:lambda:cn-northwest-1:xxxxxx:function:AceAuthorizor --status ACTIVE --signing-disabled

4.授权方添加权限

通过aws cli命令行的方式给授权方添加调用lambda的权限,

aws lambda add-permission --function-name TestAuthorizer --principal iot.amazonaws.com --source-arn arn:aws-cn:iot:cn-northwest-1:xxxxxx:authorizer/TestAuthorizer --statement-id Id-124 --action "lambda:InvokeFunction"

5.测试授权方

通过aws cli测试授权方调用lambda是否成功

aws iot test-invoke-authorizer --authorizer-name TestAuthorizer --mqtt-context "username=xxxxx,password=dGVzdA==,clientId=demo1"
密码正确,则返回授权的策略内容,如下图所示

6.总结

这里要注意aws cli 的配置,我这里最开始用IAM Role方式配置命令行,

刚开始一直报权限问题,后来直接换成用户凭证的方式配置,

 报错“An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws-cn:iam::xxxxxx:user/test is not authorized to perform: sts:AssumeRole on resource: arn:aws-cn:iam::xxxxxx:role/JITP”,后来在目录“C:\Users\用户\.aws”下config文件去掉role_arn,问题才解决。

另外,要注意给授权放添加调用lambda的权限,否则测试一直报错"An error occurred (InvalidResponseException) when calling the TestInvokeAuthorizer operation: AccessDeniedException encountered when invoking lambda; requestId: 53bc3fb4-80d2-4f89-ac98-4d529444ee48"


http://www.ppmy.cn/news/85176.html

相关文章

[论文评析]mixup: B EYOND E MPIRICAL R ISK M INIMIZATION, ICLR 2018,

mixup: B EYOND E MPIRICAL R ISK M INIMIZATION 介绍MixupMixup的提出动机Mixup与常规数据增广方法的区别References 介绍 采用ERM训练的模型往往存在泛化能力差的情形-可能是在简单的记忆样本, 对于噪声干扰的鲁棒性很差. 这篇论文提出了一种新的数据增广方法-Mixup, 这里主…

字符串、字符串列表,倒序生成字典。

带数字的字符串以数字为key倒序生成字典,字符串列表按其元素索引为key倒序生成字典。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简…

飞鲨展览:2023山东老博会,11月移师济南黄河国际会展中心

新展馆、新起点、新征程-CSOLDE2023第5届中国(济南)国际养老服务业展览会2023 Fifth China (Jinan) International Old-age Services Exhibition,移师济南黄河国际会展中心举办的通告 尊敬的参展商、观众、媒体及行业人士: 为了更…

二进制部署高可用k8s集群

第一章、前置知识点 1.1 生产环境部署K8S集群的两种方式 kubeadm Kubeadm是一个K8S部署工具,提供kubeadm init 和 kubeadm join,用于快速部署Kubernetes集群。 二进制包 从GitHub下载发行版的二进制包,手动部署每个组件,组成…

day05 java_Spring IoC 和 DI

为什么使用spring框架 1.解耦代码(每次使用都要new一个对象) 2.解决事务繁琐问题(创建对象----初始化----调用方法销毁对象) 3.使用第三方框架麻烦的问题 总结:spring是一个轻量级的Ioc,Di和AOP容器 轻量级:简洁,高效,低依赖 **容器:**创建对象并将对象存储对象,同时管理…

Seata-go TCC 设计与实现

作者:刘月财 本文主要介绍 seata-go 中 TCC 的设计思路、异常处理以及在实战中的使用。 Seata 是一款开源的分布式事务解决方案,致力于为现代化微服务架构下的分布式事务提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和…

实验四:MapReduce初级编程实践

1.编程实现文件合并和去重操作 对于两个输入文件,即文件A和文件B,编写MapReduce程序,对两个文件进行合并, 并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文件的一个样 例供参考。 输入文件A的样例如下&#…

霍夫变换理论知识及其C++代码实例

霍夫变换是一种常用的计算机视觉算法,它可以用于识别图像中的直线、圆等几何形状。本文将介绍霍夫变换的原理、应用场景以及提供C代码示例,帮助读者入门。 原理 霍夫变换的核心思想是将图像中的点转化为参数空间中的曲线或者点,然后通过计算…