Files
zszq-trs/Framework/SharedWebApi/ClientApi/ClientTokenController.cs
T
2024-05-09 14:06:26 +08:00

93 lines
3.2 KiB
C#

using JWT.Algorithms;
using JWT.Builder;
using JWT.Serializers;
using System.Text;
namespace YLWebAPI.ApiModule.ClientApi
{
/// <summary>
/// 客户端认证token
/// </summary>
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
});
}
}
}
}