using JWT.Algorithms; using JWT.Builder; using JWT.Serializers; using System.Text; namespace YLWebAPI.ApiModule.ClientApi { /// /// 客户端认证token /// public class ClientTokenController : BaseApiController { [Route("api/clientToken")] [HttpPost] public IActionResult clientToken() { if (!Request.Headers.TryGetValue("Authorization", out var authHeaders)) { return Ok(JsonError("[HTTP Header:Authorization]参数未设置")); } var authHeader = authHeaders.FirstOrDefault() ?? string.Empty; if (!authHeader.StartsWith("Basic ")) { return Ok(JsonError("[HTTP Header:Authorization]参数错误,关键字:Basic")); } int index; string joinStr; try { var bytes = Convert.FromBase64String(authHeader.Substring(6)); joinStr = Encoding.UTF8.GetString(bytes); index = joinStr.IndexOf(':'); if (index <= 0) { return Ok(JsonError("[HTTP Header:Authorization]参数错误,关键字:Value")); } } catch (Exception ex) { return Ok(JsonError(ex.GetBaseException().Message)); } var userName = joinStr.Substring(0, index); var password = joinStr.Substring(index + 1); using (var clientDB = YLErp.Modules.DbContextFactory.GetClientDbContext(CurUser)) { var user = clientDB.ClientUser.Where(n => n.LoginName == userName).FirstOrDefault(); if (user == null) { return Ok(JsonError("用户或密码错误")); } if (!DataHelper.EncryptPassword(user.LoginName.ToLowerInvariant(), password).Equals(user.Password, StringComparison.OrdinalIgnoreCase)) { return Ok(JsonError("用户或密码错误")); } var client = clientDB.client.Where(c => c.id == user.ClientId).Select(n => new { n.Guid, n.Name }).FirstOrDefault(); if (client == null) { return Ok(JsonError("客户信息不存在")); } var token = new JwtBuilder() .WithAlgorithm(new HMACSHA256Algorithm()) .WithSerializer(new JsonNetSerializer()) .WithSecret(ClientAuthAttribute.SecretKey) .AddClaim("exp", DateTimeOffset.UtcNow.AddSeconds(36100).ToUnixTimeSeconds()) .AddClaim("userId", user.id) .AddClaim("userName", user.LoginName) .Encode(); return Ok(new ClientApiTokenResponseModel { tokenType = "Bearer", accessToken = token, expiresIn = 36000, userId = user.id, userName = client.Name, userGroup = string.Empty, clientId = user.ClientId, guid = client.Guid }); } } } }