69 lines
2.4 KiB
C#
69 lines
2.4 KiB
C#
using Apimanager_backend.Exceptions;
|
||
using StackExchange.Redis;
|
||
|
||
namespace Apimanager_backend.Services
|
||
{
|
||
public class RefreshTokenService : IRefreshTokenService
|
||
{
|
||
private readonly IConnectionMultiplexer redis;
|
||
private readonly IConfiguration configuration;
|
||
public RefreshTokenService(IConnectionMultiplexer redis, IConfiguration configuration)
|
||
{
|
||
this.redis = redis;
|
||
this.configuration = configuration;
|
||
}
|
||
|
||
public async Task<string> CreateRefereshTokenAsync(string userId)
|
||
{
|
||
var refreshToken = Guid.NewGuid().ToString();
|
||
var expiryDays = Convert.ToDouble(configuration["JwtSettings:RefreshTokenExpiryDays"]);
|
||
|
||
// 保存到Redis,设置过期时间
|
||
var db = redis.GetDatabase();
|
||
var res = await db.StringSetAsync(refreshToken, userId, TimeSpan.FromDays(expiryDays));
|
||
if (!res)
|
||
{
|
||
throw new BaseException(1006, "Service unavailable");
|
||
}
|
||
return refreshToken;
|
||
}
|
||
|
||
public async Task DeleterRefreshTokenAsync(string refreshToken)
|
||
{
|
||
var db = redis.GetDatabase();
|
||
bool res = await db.KeyDeleteAsync(refreshToken);
|
||
if (!res)
|
||
{
|
||
throw new BaseException(1006, "Service unavailable");
|
||
}
|
||
}
|
||
|
||
public async Task UpdateRefreshTokenAsync(string refreshToken)
|
||
{
|
||
var db = redis.GetDatabase();
|
||
var expiryDays = Convert.ToDouble(configuration["JwtSettings:RefreshTokenExpiryDays"]);
|
||
//获取refresh剩余有效时间
|
||
var time =await db.KeyTimeToLiveAsync(refreshToken);
|
||
//判断有效时间是否大于零天小于三天,否则不刷新有效期
|
||
if(time <= TimeSpan.Zero || time >= TimeSpan.FromDays(3))
|
||
{
|
||
return;
|
||
}
|
||
//刷新过期时间
|
||
await db.KeyExpireAsync(refreshToken,TimeSpan.FromDays(expiryDays));
|
||
}
|
||
|
||
public async Task<string?> ValidateRefreshTokenAsync(string refreshToken)
|
||
{
|
||
var db = redis.GetDatabase();
|
||
var redisValue = await db.StringGetAsync(refreshToken);
|
||
//验证refreshToken是否存在
|
||
if (!redisValue.HasValue)
|
||
{
|
||
return null;
|
||
}
|
||
return redisValue.ToString();
|
||
}
|
||
}
|
||
}
|