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 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 ValidateRefreshTokenAsync(string refreshToken) { var db = redis.GetDatabase(); var redisValue = await db.StringGetAsync(refreshToken); //验证refreshToken是否存在 if (!redisValue.HasValue) { return null; } return redisValue.ToString(); } } }