BotSharp/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs

104 lines
3.4 KiB
C#
Raw Normal View History

2023-08-26 04:41:01 +00:00
using BotSharp.Abstraction.Repositories;
using BotSharp.Abstraction.Repositories.Records;
2023-06-11 23:46:02 +00:00
using BotSharp.Abstraction.Users.Models;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
namespace BotSharp.Core.Users.Services;
public class UserService : IUserService
{
private readonly IServiceProvider _services;
2023-06-17 02:42:35 +00:00
private readonly IUserIdentity _user;
2023-06-11 23:46:02 +00:00
2023-06-17 02:42:35 +00:00
public UserService(IServiceProvider services, IUserIdentity user)
2023-06-11 23:46:02 +00:00
{
_services = services;
_user = user;
}
public async Task<User> CreateUser(User user)
{
2023-08-10 04:53:22 +00:00
var db = _services.GetRequiredService<IBotSharpRepository>();
2023-09-02 05:10:46 +00:00
var record = db.GetUserByEmail(user.Email);
2023-06-11 23:46:02 +00:00
if (record != null)
{
2023-09-07 22:04:34 +00:00
return record;
2023-06-11 23:46:02 +00:00
}
2023-09-07 22:04:34 +00:00
record = user;
2023-06-11 23:46:02 +00:00
record.Email = user.Email.ToLower();
record.Salt = Guid.NewGuid().ToString("N");
record.Password = Utilities.HashText(user.Password, record.Salt);
2023-08-28 05:40:15 +00:00
record.ExternalId = _user.Id;
2023-06-11 23:46:02 +00:00
2023-09-02 05:10:46 +00:00
db.CreateUser(record);
2023-09-07 22:04:34 +00:00
return record;
2023-06-11 23:46:02 +00:00
}
public async Task<Token> GetToken(string authorization)
{
var base64 = Encoding.UTF8.GetString(Convert.FromBase64String(authorization));
var (userEmail, password) = base64.SplitAsTuple(":");
2023-08-10 04:53:22 +00:00
var db = _services.GetRequiredService<IBotSharpRepository>();
var record = db.GetUserByEmail(userEmail);
2023-06-11 23:46:02 +00:00
if (record == null)
{
return default;
}
if (Utilities.HashText(password, record.Salt) != record.Password)
{
return default;
}
var accessToken = GenerateJwtToken(record);
var jwt = new JwtSecurityTokenHandler().ReadJwtToken(accessToken);
return new Token
{
AccessToken = accessToken,
ExpireTime = jwt.Payload.Exp.Value,
TokenType = "Bearer",
Scope = "api"
};
}
2023-09-07 22:04:34 +00:00
private string GenerateJwtToken(User user)
2023-06-11 23:46:02 +00:00
{
var config = _services.GetRequiredService<IConfiguration>();
var issuer = config["Jwt:Issuer"];
var audience = config["Jwt:Audience"];
var key = Encoding.ASCII.GetBytes(config["Jwt:Key"]);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(JwtRegisteredClaimNames.NameId, user.Id),
new Claim(JwtRegisteredClaimNames.Email, user.Email),
new Claim(JwtRegisteredClaimNames.GivenName, user.FirstName),
new Claim(JwtRegisteredClaimNames.FamilyName, user.LastName),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
}),
Expires = DateTime.UtcNow.AddMinutes(5),
Issuer = issuer,
Audience = audience,
SigningCredentials = new SigningCredentials
(new SymmetricSecurityKey(key),
SecurityAlgorithms.HmacSha512Signature)
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
public async Task<User> GetMyProfile()
{
2023-08-10 04:53:22 +00:00
var db = _services.GetRequiredService<IBotSharpRepository>();
var user = db.GetUserByExternalId(_user.Id);
2023-06-11 23:46:02 +00:00
return user;
}
}