|
@@ -0,0 +1,228 @@
|
|
|
|
+using IES.ExamServer.Models;
|
|
|
|
+using Microsoft.AspNetCore.Mvc;
|
|
|
|
+using Microsoft.Extensions.Caching.Memory;
|
|
|
|
+using System.Diagnostics;
|
|
|
|
+using System.Text.Json.Nodes;
|
|
|
|
+using System.Text.Json;
|
|
|
|
+using IES.ExamServer.Helper;
|
|
|
|
+using System.DrawingCore.Imaging;
|
|
|
|
+using System.DrawingCore;
|
|
|
|
+using System.IdentityModel.Tokens.Jwt;
|
|
|
|
+
|
|
|
|
+namespace IES.ExamServer.Controllers
|
|
|
|
+{
|
|
|
|
+ [ApiController]
|
|
|
|
+ [Route("init")]
|
|
|
|
+
|
|
|
|
+ public class InitController : ControllerBase
|
|
|
|
+ {
|
|
|
|
+ private readonly IConfiguration _configuration;
|
|
|
|
+ private readonly IHttpClientFactory _httpClientFactory;
|
|
|
|
+ private readonly IMemoryCache _memoryCache;
|
|
|
|
+ private readonly ILogger<InitController> _logger;
|
|
|
|
+
|
|
|
|
+ public InitController(ILogger<InitController> logger, IConfiguration configuration, IHttpClientFactory httpClientFactory, IMemoryCache memoryCache)
|
|
|
|
+ {
|
|
|
|
+ _logger = logger;
|
|
|
|
+ _configuration=configuration;
|
|
|
|
+ _httpClientFactory=httpClientFactory;
|
|
|
|
+ _memoryCache=memoryCache;
|
|
|
|
+ }
|
|
|
|
+ [HttpPost("device")]
|
|
|
|
+ public async Task<IActionResult> Device()
|
|
|
|
+ {
|
|
|
|
+ int code = 0;
|
|
|
|
+ string msg = string.Empty;
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ _memoryCache.TryGetValue(Constant._KeyServerCenter, out JsonNode? data);
|
|
|
|
+ if (data!=null)
|
|
|
|
+ {
|
|
|
|
+ return Ok(new { code = 200, msg = "云端服务连接成功!", data = data });
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ code=500;
|
|
|
|
+ msg="云端服务未连接!";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ catch (Exception ex)
|
|
|
|
+ {
|
|
|
|
+ code=500;
|
|
|
|
+ msg="云端服务未连接!";
|
|
|
|
+ }
|
|
|
|
+ return Ok(new { code, msg });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ {
|
|
|
|
+ "type":"sms",//qrcode二维码扫码登录:randomCode必传; sms 短信验证登录:randomCode必传,mobile必传
|
|
|
|
+ "randomCode",
|
|
|
|
+ "mobile":"1528377****"
|
|
|
|
+ }
|
|
|
|
+ **/
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 登录验证
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="randomCode"></param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ [HttpPost("login-check")]
|
|
|
|
+ public async Task<IActionResult> LoginCheck(JsonNode json)
|
|
|
|
+ {
|
|
|
|
+ int code = 0;
|
|
|
|
+ string msg = string.Empty;
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ var type = json["type"];
|
|
|
|
+ string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
|
|
|
|
+ if (!string.IsNullOrWhiteSpace($"{type}"))
|
|
|
|
+ {
|
|
|
|
+ TmdidImplicit? token = null;
|
|
|
|
+ string x_auth_token = string.Empty;
|
|
|
|
+ List<School>? schools = null;
|
|
|
|
+ JsonNode? jsonNode = null;
|
|
|
|
+ switch (true)
|
|
|
|
+ {
|
|
|
|
+ case bool when $"{type}".Equals("qrcode"):
|
|
|
|
+ {
|
|
|
|
+ string randomCode = $"{json["randomCode"]}";
|
|
|
|
+ System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
|
|
|
|
+
|
|
|
|
+ var response = await _httpClientFactory.CreateClient().GetAsync($"{CenterUrl}/hita/check-login?code={randomCode}");
|
|
|
|
+ if (response.IsSuccessStatusCode)
|
|
|
|
+ {
|
|
|
|
+ string content = await response.Content.ReadAsStringAsync();
|
|
|
|
+ if (!string.IsNullOrWhiteSpace(content))
|
|
|
|
+ {
|
|
|
|
+ jsonNode = JsonSerializer.Deserialize<JsonNode>(content);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ code=400;
|
|
|
|
+ msg="随机码验证失败";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ code=400;
|
|
|
|
+ msg="随机码验证错误";
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case bool when $"{type}".Equals("smspin"):
|
|
|
|
+ {
|
|
|
|
+ string pin_code = $"{json["pin_code"]}";
|
|
|
|
+ string account = $"{json["account"]}";
|
|
|
|
+ var response = await _httpClientFactory.CreateClient().PostAsJsonAsync($"{CenterUrl}/core/sendsms/check", new { pin_code, account });
|
|
|
|
+ if (response.IsSuccessStatusCode)
|
|
|
|
+ {
|
|
|
|
+ string content = await response.Content.ReadAsStringAsync();
|
|
|
|
+ if (!string.IsNullOrWhiteSpace(content))
|
|
|
|
+ {
|
|
|
|
+ jsonNode = JsonSerializer.Deserialize<JsonNode>(content);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ code=400;
|
|
|
|
+ msg="短信验证返回结果为空";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ code=400;
|
|
|
|
+ msg="短信验证错误";
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if (jsonNode != null && $"{jsonNode["code"]}".Equals("200"))
|
|
|
|
+ {
|
|
|
|
+ token = JsonSerializer.Deserialize<TmdidImplicit>(jsonNode["implicit_token"]);
|
|
|
|
+ x_auth_token = $"{jsonNode["x_auth_token"]}";
|
|
|
|
+ schools = JsonSerializer.Deserialize<List<School>>(jsonNode["schools"]);
|
|
|
|
+ var jwt = new JwtSecurityToken(token?.id_token);
|
|
|
|
+ var id = jwt.Payload.Sub;
|
|
|
|
+ jwt.Payload.TryGetValue("name", out object? name);
|
|
|
|
+ jwt.Payload.TryGetValue("picture", out object? picture);
|
|
|
|
+ _memoryCache.Set($"Teacher:{id}", new LoginTeacher { id=id, name=$"{name}", implicit_token= token, picture=$"{picture}", schools=schools, x_auth_token=x_auth_token });
|
|
|
|
+ return Ok(new { implicit_token = token, x_auth_token = x_auth_token, schools = schools });
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ code=400;
|
|
|
|
+ msg="验证失败";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ code=400;
|
|
|
|
+ msg="参数错误";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ catch (Exception ex)
|
|
|
|
+ {
|
|
|
|
+ code=500;
|
|
|
|
+ msg="异常错误";
|
|
|
|
+ }
|
|
|
|
+ return Ok(new { code = code });
|
|
|
|
+ }
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 登录模式初始化
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ [HttpGet("/login-init")]
|
|
|
|
+ public async Task<IActionResult> LoginInit(JsonNode json)
|
|
|
|
+ {
|
|
|
|
+ var type = json["type"];
|
|
|
|
+ string qrcode = string.Empty;
|
|
|
|
+ string randomCode = "";
|
|
|
|
+ switch (true)
|
|
|
|
+ {
|
|
|
|
+ case bool when $"{type}".Equals("qrcode"):
|
|
|
|
+ {
|
|
|
|
+ // 生成二维码图片
|
|
|
|
+ Random random = new Random();
|
|
|
|
+ randomCode = $"{random.Next(1000, 9999)}";
|
|
|
|
+ string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
|
|
|
|
+ string content = $"{CenterUrl}/joinSchool?schoolCode=login:{randomCode}&m=%E7%99%BB%E5%BD%95&o=1";
|
|
|
|
+ Bitmap qrCodeImage = QRCodeHelper.GetBitmap(content, 200, 200);
|
|
|
|
+ using (MemoryStream stream = new MemoryStream())
|
|
|
|
+ {
|
|
|
|
+ qrCodeImage.Save(stream, ImageFormat.Png);
|
|
|
|
+ byte[] data = stream.ToArray();
|
|
|
|
+ qrcode=$"data:image/png;base64,{Convert.ToBase64String(data)}";
|
|
|
|
+ }
|
|
|
|
+ return Ok(new { code = 200, randomCode = randomCode, qrcode, type });
|
|
|
|
+ }
|
|
|
|
+ case bool when $"{type}".Equals("smspin"):
|
|
|
|
+ {
|
|
|
|
+ int send = 0;
|
|
|
|
+ if (!string.IsNullOrWhiteSpace($"{json["area"]}") && !string.IsNullOrWhiteSpace($"{json["to"]}"))
|
|
|
|
+ {
|
|
|
|
+ string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
|
|
|
|
+ string url = $"{CenterUrl}/core/sendsms/pin";
|
|
|
|
+ HttpResponseMessage message = await _httpClientFactory.CreateClient().PostAsJsonAsync(url, new { });
|
|
|
|
+ if (message.IsSuccessStatusCode)
|
|
|
|
+ {
|
|
|
|
+ string content = await message.Content.ReadAsStringAsync();
|
|
|
|
+ JsonNode? jsonNode = JsonSerializer.Deserialize<JsonNode>(content);
|
|
|
|
+ if (jsonNode!=null && int.TryParse($"{jsonNode["send"]}", out int s))
|
|
|
|
+ {
|
|
|
|
+ send = s;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return Ok(new { code = 200, send, type });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return Ok(new { code = 400 });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|