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; } #region 创建刷新令牌 public async Task 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; } #endregion #region 删除刷新令牌 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"); } } #endregion #region 刷新令牌有效期 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)); } #endregion #region 验证令牌 public async Task 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; } #endregion } }