В настоящее время мое решение включает в себя:
- Проверку токенов, полученных от внешних служб.
- Генерацию токенов носителя JWT вручную. >
Код: Выделить всё
[HttpPost("login")]
public async Task Login([FromBody] GoogleLoginRequest request)
{
try
{
var user = await _googleAuthService.GetUserDetails(request.IdToken);
if (user == null)
return BadRequest("Invalid user information received from Google services");
user = await _createUser.ExecuteAsync(user);
if (user == null)
return Problem("Unable to create user");
var tokenResponse = await _userTokenService.GenerateAccessToken(user);
return Ok(tokenResponse);
}
catch (Exception ex)
{
return Problem("Internal server error");
}
}
Код: Выделить всё
public async Task GenerateAccessToken(IdentityUser user)
{
var userRoles = await _context.UserRoles
.Where(ur => ur.UserId == user.Id)
.Join(_context.Roles, ur => ur.RoleId, r => r.Id, (ur, r) => r.Name)
.ToListAsync();
var roleClaims = userRoles.Select(role => new Claim(ClaimTypes.Role, role)).ToList();
var claims = new List
{
new Claim(ClaimTypes.NameIdentifier, user.Id),
new Claim(ClaimTypes.Name, user.NormalizedUserName!),
new Claim(ClaimTypes.Email, user.Email!)
}
.Union(roleClaims);
var key = new SymmetricSecurityKey(Convert.FromBase64String(_configuration["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expiration = DateTime.UtcNow.AddHours(int.Parse(_configuration["Jwt:ExpirationInHours"]!));
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:Issuer"],
audience: _configuration["Jwt:Audience"],
claims: claims,
expires: expiration,
signingCredentials: creds);
var jwt = new JwtSecurityTokenHandler().WriteToken(token);
var refreshToken = await GenerateRefreshTokenAsync(user);
return new AccessTokenResponse
{
AccessToken = jwt,
ExpiresIn = (int)(expiration - DateTime.UtcNow).TotalSeconds,
RefreshToken = refreshToken.Token
};
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... -framework