阿里云微服务消息队列(MQTT For IoT)C# 获取Token示例Demo
概述
微消息队列MQTT通过Token鉴权模式向MQTT客户端提供有时效性的临时访问权限。通过MQTT Token服务可以给本地账号系统管理的用户颁发临时的访问凭证,并限制访问权限,以实现对单一客户端,单一资源的细粒度权限控制。目前官方已经给出了Java获取Token的Demo,下面给出基于C#获取Token的实现,然后使用PostMan工具测试,用户可以基于PostMan工具生成其它语言获取Token的方法。
相关参考
1、API官方说明地址;
2、参考Java Demo;
C# Code实现
1、Nuget 安装:Newtonsoft,处理Json对象使用;
2、完整的Code Sample
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json.Linq;
namespace MQTTTokenDemo
{
class Program
{
static void Main(string[] args)
{
// 参数解释:https://help.aliyun.com/document_detail/54276.html?spm=a2c4g.11186623.6.572.632e2584wtKkVY
string resources = "Demodd/AAA";
string instanceId = "post-cn-mp9********";
string accessKey = "********";
string secretkey = "********";
long expireTime = 10000000L;
applyToken(resources, instanceId, accessKey, secretkey, expireTime);
}
/// <summary>
/// 请求获取Token
/// </summary>
/// <param name="resources">资源名称,即 MQTT Topic,多个 Topic 以逗号(,)分隔</param>
/// <param name="instanceId">MQTT 实例 ID,一定要和客户端实际使用的实例 ID 匹配</param>
/// <param name="accessKey">当前请求使用的账号的 AccessKeyId</param>
/// <param name="secretkey">当前请求使用的账号的 AccessSecretId</param>
/// <param name="expireTime">Token 失效的毫秒时间戳</param>
public static void applyToken(string resources, string instanceId, string accessKey, string secretkey, long expireTime)
{
string apiUrl = "https://mqauth.aliyuncs.com/token/apply";
Dictionary<string, string> paramDic = new Dictionary<string, string>();
paramDic.Add("resources", resources);
paramDic.Add("actions", "R,W");
paramDic.Add("serviceName", "mq");
paramDic.Add("expireTime", (((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000) + expireTime).ToString());
paramDic.Add("instanceId", instanceId);
string signature = doHttpSignature(paramDic, secretkey);
paramDic.Add("proxyType", "MQTT");
paramDic.Add("accessKey", accessKey);
paramDic.Add("signature", System.Web.HttpUtility.UrlEncode(signature)); // 注意:此处务必对求得的signature进行urlencode处理,否则可能会因为不同时间求取的signature中可能包含特殊字符而出现请求407报错
//Console.WriteLine(sendRequestToGetToken(apiUrl, paramDic));
JObject json = JObject.Parse(sendRequestToGetToken(apiUrl, paramDic));
Console.WriteLine("Token: " + json["tokenData"].ToString());
Console.ReadKey();
}
/// <summary>
/// 计算签名signature
/// </summary>
/// <param name="paramDic"> 参数字典 </param>
/// <param name="secretKey"> accessSecret </param>
/// <returns> 返回签名 </returns>
public static string doHttpSignature(Dictionary<string, string> paramDic, string secretKey)
{
List<string> paramList = new List<string>();
foreach (KeyValuePair<string, string> kvp in paramDic)
{
paramList.Add(kvp.Key + "=" + kvp.Value);
}
paramList.Sort();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < paramList.Count; i++)
{
if (i > 0)
{
stringBuilder.Append("&");
}
stringBuilder.Append(paramList[i]);
}
HMACSHA1 hmacKey = new HMACSHA1(Encoding.UTF8.GetBytes(secretKey));
string signature = Convert.ToBase64String(hmacKey.ComputeHash(Encoding.UTF8.GetBytes(stringBuilder.ToString())));
return signature;
}
/// <summary>
/// 发送请求以获取token
/// </summary>
/// <param name="url"> url </param>
/// <param name="parameters"> 请求的参数 </param>
/// <param name="encoding"> 请求参数的编码方式 </param>
/// <returns> 返回响应结果 </returns>
public static string sendRequestToGetToken(string url, Dictionary<string, string> parameters)
{
//设置请求接口
var request = (HttpWebRequest)WebRequest.Create(url);
byte[] data = null;
StringBuilder buffer = new StringBuilder();
// 设置请求参数
if (!(parameters == null || parameters.Count == 0))
{
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
else
{
buffer.AppendFormat("{0}={1}", key, parameters[key]);
}
i++;
}
}
data = Encoding.UTF8.GetBytes(buffer.ToString());
//请求方式
request.Method = "POST";
//请求头参数设置
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
WebResponse response;
try
{
response = request.GetResponse();
}
catch (WebException ex)
{
response = ex.Response;
}
//转字符串
string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
return responseString;
}
}
}
3、测试运行结果
Post Man工具使用
1、具体的测试参数可以在上面Code的parameters对象中获取
2、请求参数设置
3、一键生成其它语言Demo
注意: signature参数还是需要使用者基于自己的开发语言自行参考Java或C# Demo实现。
参考链接
lmq-demo
C# POST请求demo,contentType 格式:application/x-www-form-urlencoded

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
解密 云HBase时序引擎OpenTSDB 优化技术
逝者如斯夫,不舍昼夜。 —— 孔子 时间如流水,一去不复返。自古不乏对时间流逝的感慨,而现代已经有很多技术记录流逝的过去。我们可以拍照,可以录像,当然还可以用时序数据库! 时序数据库是专门存放随着时间推移而不断变化的数据。近些年,随着IoT等概念的流行,时序数据库成为数据库一个相对独立的领域逐渐受到重视,广泛应用于物联网、监控系统、金融、医疗和零售等多种场景。 过去12个月时序数据库(Time Series DBMS)热度不断增长 那么云上的用户如何构建一个存储海量数据的时序数据库呢?笔者这里推荐使用 云HBase + OpenTSDB 方案。云HBase是使用阿里多年优化过的HBase内核版本,本文不作过多介绍,详情请看 产品主页。 OpenTSDB简介 OpenTSDB是一款基于HBase构建的时序数据库,它的数据存储完全交给HBase,本身没有任何数据存储。所有节点是对等的,所以部署起来其实是非常方便的。因为基于HBase,所以本身就具备了横向扩展,存储海量数据的能力。常见的部署模式有2种,一种分离部署,一种混合部署。 独立部署,即与多个业务共享一个HBase。适合时序业务较小,...
-
下一篇
区块链数据分析必备工具BlockETL
BlockETL软件包用于比特币区块链数据分析中的数据抽取/转换/加载(ETL),可以从原始的比特币区块文件中抽取区块与交易数据并加载入通用SQL数据库,以便于后续的数据分析处理,非常适合区块链数据分析相关的毕业设计或课题研究项目。BlockETL官方下载地址:http://sc.hubwiz.com/codebag/blocketl-java/。 1、软件包概述 BlockETL软件包的主要特性如下: 直接读取原始区块文件,抽取速度快 将原始区块和交易数据加载至SQL数据库,便于后续的区块链数据分析 支持多流水线并行处理,可自己控制并发流水线数量 结构设计清晰,代码便于扩展 BlockETL软件包采用Java开发,支持Windows、OSX和Linux等多种操作系统,当前版本1.0.0,主要类/接口及关系如下图所示: BlockETL软件包的目录组织及主要代码文件清单如下: 代码文件 说明 build.gradle Gradle根项目构建文件 settings.gradle Gradle根项目配置文件 blocketl/ blocketl库代码目录 blocketl/build.gr...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- MySQL数据库在高并发下的优化方案
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程