75 lines
2.6 KiB
C#
75 lines
2.6 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;
|
||
private readonly int DbIndex = 0;
|
||
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(DbIndex);
|
||
var res = await db.StringSetAsync( userId , refreshToken, TimeSpan.FromDays(expiryDays));
|
||
if (!res)
|
||
{
|
||
throw new BaseException(1006, "Service unavailable");
|
||
}
|
||
return refreshToken;
|
||
}
|
||
|
||
public async Task DeleterRefreshTokenAsync(string userId)
|
||
{
|
||
var db = redis.GetDatabase(DbIndex);
|
||
bool res = await db.KeyDeleteAsync(userId);
|
||
if (!res)
|
||
{
|
||
throw new BaseException(1006, "Service unavailable");
|
||
}
|
||
}
|
||
|
||
public async Task UpdateRefreshTokenAsync(string userId)
|
||
{
|
||
var db = redis.GetDatabase(DbIndex);
|
||
var expiryDays = Convert.ToDouble(configuration["JwtSettings:RefreshTokenExpiryDays"]);
|
||
//获取refresh剩余有效时间
|
||
var time =await db.KeyTimeToLiveAsync(userId);
|
||
//判断有效时间是否大于零天小于三天,否则不刷新有效期
|
||
if(time <= TimeSpan.Zero || time >= TimeSpan.FromDays(3))
|
||
{
|
||
return;
|
||
}
|
||
//刷新过期时间
|
||
await db.KeyExpireAsync(userId,TimeSpan.FromDays(expiryDays));
|
||
}
|
||
|
||
public async Task<bool> ValidateRefreshTokenAsync(string userId,string refreshToken)
|
||
{
|
||
var db = redis.GetDatabase(DbIndex);
|
||
var redisValue = await db.StringGetAsync(userId);
|
||
//验证refreshToken是否存在
|
||
if (!redisValue.HasValue)
|
||
{
|
||
return false;
|
||
}
|
||
string refreshTokenTrue = redisValue.ToString();
|
||
if (!refreshToken.Equals(refreshTokenTrue))
|
||
{
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
}
|
||
}
|