using Furion.DataEncryption;
using Microsoft.AspNetCore.Http;
using SimpleTool;
namespace SafeCampus.Plugin.Mqtt
{
///
///
///
public class MqttService : IMqttService
{
private readonly ISimpleCacheService _simpleCacheService;
private readonly ISysUserService _sysUserService;
private readonly IConfigService _configService;
public MqttService(ISimpleCacheService simpleCacheService, ISysUserService sysUserService, IConfigService configService)
{
_simpleCacheService = simpleCacheService;
_sysUserService = sysUserService;
_configService = configService;
}
///
public async Task GetWebLoginParameter()
{
var user = await _sysUserService.GetUserById(UserManager.UserId);//获取用户信息
var token = JWTEncryption.GetJwtBearerToken((DefaultHttpContext)App.HttpContext);// 获取当前token
//获取mqtt配置
var mqttconfig = await _configService.GetListByCategory(CateGoryConst.Config_MQTT_BASE);
//地址
var url = mqttconfig.Where(it => it.ConfigKey == DevConfigConst.MQTT_PARAM_URL).Select(it => it.ConfigValue).FirstOrDefault();
//用户名
var userName = mqttconfig.Where(it => it.ConfigKey == DevConfigConst.MQTT_PARAM_USERNAME).Select(it => it.ConfigValue).FirstOrDefault();
//密码
var password = mqttconfig.Where(it => it.ConfigKey == DevConfigConst.MQTT_PARAM_PASSWORD).Select(it => it.ConfigValue).FirstOrDefault();
#region 用户名特殊处理
if (userName.ToLower() == "$username")
userName = user.Account;
else if (userName.ToLower() == "$userid")
userName = user.Id.ToString();
#endregion 用户名特殊处理
#region 密码特殊处理
if (password.ToLower() == "$username")
password = token;// 当前token作为mqtt密码
#endregion 密码特殊处理
var clientId = $"{user.Id}_{RandomHelper.CreateLetterAndNumber(5)}";//客户端ID
_simpleCacheService.Set(MqttConst.Cache_MqttClientUser + clientId, token, TimeSpan.FromMinutes(1));//将该客户端ID对应的token插入redis后面可以根据这个判断是哪个token登录的
return new MqttParameterOutput
{
ClientId = clientId,
Password = password,
Url = url,
UserName = userName,
Topics = new List { MqttConst.Mqtt_TopicPrefix + user.Id }//默认监听自己
};
}
///
public async Task Auth(MqttAuthInput input)
{
var user = await _sysUserService.GetUserByAccount(input.Username);
var mqttAuthOutput = new MqttAuthOutput { Is_superuser = false, Result = "deny" };
//获取用户token
var tokens = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, user.Id.ToString());
if (tokens != null)
{
if (tokens.Any(it => it.Token == input.Password))//判断是否有token
mqttAuthOutput.Result = "allow";//允许登录
}
return mqttAuthOutput;
}
#region 方法
#endregion 方法
}
}