93 lines
3.2 KiB
C#
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
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|