using Hei.Captcha;
using HiTeachCE.Extension;
using HiTeachCE.Helpers;
using HiTeachCE.Models;
using HiTeachCE.Services;
using IdentityModel;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using OpenXmlPowerTools;
using Org.BouncyCastle.Ocsp;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Text.Json;
using System.Threading.Tasks;
using TEAMModelOS.SDK.Context.Configuration;
using TEAMModelOS.SDK.Context.Exception;
using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
using TEAMModelOS.SDK.Extension.JwtAuth.Models;
using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
using TEAMModelOS.SDK.Helper.Common.JsonHelper;
using TEAMModelOS.SDK.Helper.Security.ShaHash;
namespace HiTeachCE.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class LoginController : BaseController
{
public static int smsTTL = 1 * 60;
public static int ticketTTL = 1 * 24 * 60 * 60;
public static int freeTTL = 7 * 24 * 60 * 60;
public static int deviceTTL = 1 * 24 * 60 * 60;
public static string freeOrg = "7f847a9f05224184a5d01ee69a6b00d6";
public static string model_teach = "teach";
public static string model_prepare = "prepare";
private readonly LecturerService lecturerService;
private readonly OrganizationService organizationService;
private readonly MemberService memberService;
private readonly ActivationCodeService activationCodeService;
private readonly SecurityCodeHelper securityCode;
public LoginController(LecturerService lecturer, OrganizationService organization, MemberService member, ActivationCodeService activationCode, SecurityCodeHelper _securityCode)
{
lecturerService = lecturer;
organizationService = organization;
memberService = member;
activationCodeService = activationCode;
securityCode = _securityCode;
}
///
/// 注册装置
///
///
///
[HttpPost("regist")]
[Authorize(Policy = "lecturer")]
public BaseJosnRPCResponse Regist(JosnRPCRequest> request)
{
JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
string unionid = GetLoginUser(JwtClaimTypes.Id);
/**
"params": {
"deviceId": "f67fb5dd-ee1b-d3b7-9b95-61022d7e8acd",
"clientId": "931dee8c-74be-4c9b-a602-c74583b0e985",
}
*/
if (request.@params.TryGetValue("deviceId", out string deviceId) && request.@params.TryGetValue("orgCode", out string orgCode) && string.IsNullOrEmpty(unionid))
{
Dictionary dict = ActivationValid(orgCode, unionid);
if (dict.TryGetValue("flag", out object flag) && bool.Parse(flag.ToString()))
{
if (RedisHelper.HExists("device:" + deviceId, orgCode))
{
}
else
{
RedisHelper.HSet("device:" + deviceId, orgCode, unionid);
RedisHelper.Expire("device:" + deviceId, deviceTTL);
}
return builder.Data(new Dictionary { { "deviceId", deviceId } }).build();
}
else
{
throw new BizException("授权失败!", 2);
}
}
else
{
throw new BizException("参数错误!", 2);
}
}
///
/// 创建教室
///
///
///
[HttpPost("createGroup")]
[Authorize]
public BaseJosnRPCResponse CreateGroup(JosnRPCRequest> request)
{
/**
"params": {
"deviceId": "f67fb5dd-ee1b-d3b7-9b95-61022d7e8acd",
"doBoundGroupNum": false,
"extraInfo": {}
}
*/
JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
string ClientId =// new List() { "fb564dde14df423cafac2085936e3b96" };
GetLoginUser(JwtClaimTypes.ClientId);
string groupNum;
if (request.@params.TryGetValue("deviceId", out string deviceId) && string.IsNullOrEmpty(ClientId))
{
if (RedisHelper.HExists("device:" + ClientId, deviceId))
{
groupNum = RedisHelper.HGet("device:" + ClientId, deviceId);
if (string.IsNullOrEmpty(groupNum)) {
do
{
groupNum = RandGroupNum();
} while (RedisHelper.Exists("group:" + groupNum));
RedisHelper.HSet("group:" + groupNum, deviceId, null);
RedisHelper.Expire("group:" + groupNum, deviceTTL);
RedisHelper.HSet("device:" + ClientId, deviceId, groupNum);
}
}
else { throw new BizException("装置未注册", 2); }
}
else {
throw new BizException("参数错误", 2);
}
return builder.Data(groupNum).build();
}
public string RandGroupNum() {
Random random = new Random();
String result = "";
for (int i = 0; i < 6; i++)
{
result += random.Next(0, 10);
}
return result;
}
///
/// 加入教室
///
///
///
[HttpPost("joinGroup")]
[Authorize]
public BaseJosnRPCResponse JoinGroup(JosnRPCRequest> request)
{
string ClientId = GetLoginUser(JwtClaimTypes.ClientId);
string Unionid = GetLoginUser(JwtClaimTypes.Id);
string Role = GetLoginUser(JwtClaimTypes.Role);
JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
Dictionary dict;
/**
"params": {
"deviceId": "f67fb5dd-ee1b-d3b7-9b95-61022d7e8acd",
"groupNum": "818288"
}
*/
if (request.@params.TryGetValue("deviceId", out string deviceId) &&
request.@params.TryGetValue("groupNum", out string groupNum) &&
!string.IsNullOrEmpty(deviceId) && !string.IsNullOrEmpty(groupNum)
)
{
if (RedisHelper.Exists("group:" + groupNum))
{
dict = MqttInfo(ClientId, deviceId, groupNum, Unionid, Role);
}
else {
throw new BizException("教室不存在", 2);
}
}
else
{
throw new BizException("参数错误", 2);
}
return builder.Data(dict).build();
}
private static Dictionary MqttInfo( string ClientId, string deviceId, string groupNum, string Unionid, string Role)
{
string brokerHostName = BaseConfigModel.Configuration["brokerHostName"];
Dictionary dict = new Dictionary();
string password = brokerHostName + "/" + groupNum + "/" + deviceId + "/" + ClientId;
//发给前端使用的
string h1 = BCrypt.Net.BCrypt.HashPassword(password);
//后端存储使用的
string h2 = BCrypt.Net.BCrypt.HashPassword(h1, BCrypt.Net.SaltRevision.Revision2);
bool validPassword = BCrypt.Net.BCrypt.Verify(h1, h2);
string uname = password;
Dictionary connectInfo = new Dictionary
{
{ "brokerHostName", brokerHostName },
{ "brokerHostNameWSS", "wss://" +brokerHostName+"/mqtt"} ,
{ "clientID", deviceId },
//使用BCrypt加密
{ "password",h1} ,
{ "username",uname}
};
Dictionary subscribeTopic = BaseConfigModel.Configuration.GetSection("SubscribeTopic").Get>();
subscribeTopic["receiveMsg"] = subscribeTopic["receiveMsg"].Replace("{deviceId}", deviceId);
Dictionary publishTopic = BaseConfigModel.Configuration.GetSection("PublishTopic").Get>();
publishTopic["sendMsg"] = publishTopic["sendMsg"].Replace("{deviceId}", deviceId).Replace("{groupNum}", groupNum);
dict.Add("mqtt", new Dictionary() { { "connectInfo", connectInfo }, { "publishTopic", publishTopic }, { "subscribeTopic", subscribeTopic } });
List topic = new List();
topic.AddRange(publishTopic.Values.ToList());
topic.AddRange(subscribeTopic.Values.ToList());
MQTTInfo mqtt = new MQTTInfo
{
brokerHostName = brokerHostName,
brokerHostNameWSS = "wss://" + brokerHostName + "/mqtt",
clientID = deviceId,
//使用BCrypt加密
password = h2,
username = uname,
topic = topic
};
var groupMember = new MQTTMember
{
clientId = ClientId,
deviceId = deviceId,
unionid = Unionid ,
role = "lecturer",
groupNum = groupNum
};
RedisHelper.HSet("group:" + groupNum, deviceId, groupMember);
RedisHelper.HSet("mqtt:" + deviceId, deviceId, mqtt);
RedisHelper.Expire("mqtt:" + deviceId, deviceTTL);
return dict;
}
///
/// 认证
///
///
///
[HttpPost("adminAuth")]
public BaseJosnRPCResponse AdminAuth(JosnRPCRequest> request)
{
JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
if (request.@params.TryGetValue("ticket", out string ticket)){
if (RedisHelper.Exists("ticket:" + ticket))
{
string[] vals = RedisHelper.HVals("ticket:" + ticket);
if (vals != null && vals.Length > 0)
{
string cellphone = vals[0];
Expression> linq = null;
linq = m => m.cellphone == cellphone;
List lecturers = lecturerService.GetList(linq);
if (lecturers.IsNotEmpty())
{
List RootUsers= BaseConfigModel.Configuration.GetSection("RootUser").Get>();
ClaimModel claimModel = new ClaimModel
{
Scope = "Admin"
};
claimModel.Claims.Add(new Claim(JwtClaimTypes.Name, lecturers[0].username));
claimModel.Claims.Add(new Claim(JwtClaimTypes.Id, lecturers[0].unionid));
claimModel.Claims.Add(new Claim(JwtClaimTypes.PhoneNumber, lecturers[0].cellphone));
if (RootUsers.Contains(lecturers[0].cellphone))
{
// claimModel.Claims.Add(new Claim(JwtClaimTypes.Role, role));
// 可以将一个用户的多个角色全部赋予;
claimModel.Claims.AddRange("root".Split(',').Select(s => new Claim(JwtClaimTypes.Role, s)));
}
else {
// claimModel.Claims.Add(new Claim(JwtClaimTypes.Role, role));
// 可以将一个用户的多个角色全部赋予;
claimModel.Claims.AddRange("admin".Split(',').Select(s => new Claim(JwtClaimTypes.Role, s)));
}
// claimModel.Claims.Add(new Claim(JwtClaimTypes.Role, role));
//claimModel.Claims.Add(new Claim(JwtClaimTypes.ClientId, activationCodes[0].clientId));
// claimModel.Claims.Add(new Claim("org", orgCode));
JwtResponse jwtResponse = JwtHelper.IssueJWT(claimModel);
//string sha = ShaHashHelper.GetSHA1(jwtResponse.Access_token);
//RedisHelper.HSet("jwt:"+sha,sha,jwtResponse.Access_token );
//RedisHelper.Expire("jwt:" + sha, 86400);
// return jwtResponse;
}
}
}
}
return null;
}
///
/// 教学认证
///
///
///
[HttpPost("auth")]
[Authorize(Policy = "lecturer")]
public BaseJosnRPCResponse Auth(JosnRPCRequest