所有都用SimApiUitl.Json,增加了Gate,auth增加了获取所有token

This commit is contained in:
2026-05-03 19:34:47 +08:00
parent 894d6930f7
commit e3fc7db01c
16 changed files with 236 additions and 34 deletions
+94 -10
View File
@@ -1,25 +1,42 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using Microsoft.Extensions.Caching.Distributed;
using SimApi.Communications;
using StackExchange.Redis;
namespace SimApi.Helpers;
/// <summary>
/// 认证助手
/// </summary>
public class SimApiAuth(IDistributedCache cache)
public class SimApiAuth(IDistributedCache cache, IConnectionMultiplexer redis)
{
private const string TokenCacheKey = "SimApi:Auth:Token:{token}";
private const string TokenSetCacheKey = "SimApi:Auth:User:{userId}";
private readonly IDatabase _redisDb = redis.GetDatabase();
/// <summary>
/// 登录信息
/// </summary>
/// <param name="loginItem"></param>
/// <param name="expireTime"></param>
/// <param name="token"></param>
/// <returns></returns>
public string Login(SimApiLoginItem loginItem, string? token = null)
public string Login(SimApiLoginItem loginItem, TimeSpan? expireTime = null, string? token = null)
{
expireTime ??= TimeSpan.FromDays(7);
token ??= Guid.NewGuid().ToString();
cache.SetString(token, JsonSerializer.Serialize(loginItem));
var cacheKey = TokenCacheKey.Replace("{token}", token);
var setCacheKey = TokenSetCacheKey.Replace("{userId}", loginItem.Id);
_redisDb.SetAdd(setCacheKey, token);
cache.SetString(cacheKey, SimApiUtil.Json(loginItem),
new DistributedCacheEntryOptions
{
SlidingExpiration = expireTime
});
_redisDb.KeyExpire(setCacheKey, expireTime.Value);
return token;
}
@@ -31,10 +48,15 @@ public class SimApiAuth(IDistributedCache cache)
/// <returns></returns>
public string Update(SimApiLoginItem loginItem, string token)
{
cache.SetString(token, JsonSerializer.Serialize(loginItem));
var cacheKey = TokenCacheKey.Replace("{token}", token);
cache.SetString(cacheKey, SimApiUtil.Json(loginItem));
var ttl = _redisDb.KeyTimeToLive(cacheKey);
var setCacheKey = TokenSetCacheKey.Replace("{userId}", loginItem.Id);
_redisDb.KeyExpire(setCacheKey, ttl);
return token;
}
/// <summary>
/// 获取登陆信息
/// </summary>
@@ -42,19 +64,81 @@ public class SimApiAuth(IDistributedCache cache)
/// <returns></returns>
public SimApiLoginItem? GetLogin(string token)
{
var login = cache.GetString(token);
return login != null ? JsonSerializer.Deserialize<SimApiLoginItem>(login) : null;
var cacheKey = TokenCacheKey.Replace("{token}", token);
var login = cache.GetString(cacheKey);
var resp = login != null ? SimApiUtil.FromJson<SimApiLoginItem>(login) : null;
if (resp != null)
{
var ttl = _redisDb.KeyTimeToLive(cacheKey);
var setCacheKey = TokenSetCacheKey.Replace("{userId}", resp.Id);
_redisDb.KeyExpire(setCacheKey, ttl);
}
return resp;
}
/// <summary>
/// 获取所有的登录token
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public SimApiLoginItem[] GetAllLogins(string userId)
{
var setCacheKey = TokenSetCacheKey.Replace("{userId}", userId);
var allLogins = _redisDb.SetMembers(setCacheKey).ToStringArray();
var resp = new List<SimApiLoginItem>();
foreach (var login in allLogins)
{
if (login != null)
{
var item = GetLogin(login);
if (item != null)
{
resp.Add(item);
}
else
{
_redisDb.SetRemove(setCacheKey, login);
}
}
}
return resp.ToArray();
}
/// <summary>
/// 退出所有登录
/// </summary>
/// <param name="userId"></param>
public void LogoutAll(string userId)
{
var setCacheKey = TokenSetCacheKey.Replace("{userId}", userId);
var allLogins = _redisDb.SetMembers(setCacheKey).ToStringArray();
foreach (var login in allLogins)
{
if (login != null)
{
var cacheKey = TokenCacheKey.Replace("{token}", login);
cache.Remove(cacheKey);
}
}
_redisDb.KeyDelete(setCacheKey);
}
/// <summary>
/// 退出登陆
/// </summary>
/// <param name="uuid">登陆标识</param>
public void Logout(string uuid)
/// <param name="token">登陆标识</param>
public void Logout(string token)
{
if (!string.IsNullOrEmpty(uuid))
var item = GetLogin(token);
if (item != null)
{
cache.Remove(uuid);
var setCacheKey = TokenSetCacheKey.Replace("{userId}", item.Id);
_redisDb.SetRemove(setCacheKey, token);
var cacheKey = TokenCacheKey.Replace("{token}", token);
cache.Remove(cacheKey);
}
}
}
+45
View File
@@ -151,6 +151,51 @@ public static class SimApiUtil
return sb.ToString();
}
/// <summary>
/// 字符串Base64编码
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string Base64Encode(string str)
{
var bytes = Encoding.UTF8.GetBytes(str);
return Convert.ToBase64String(bytes);
}
/// <summary>
/// 从Base64中解码字符串
/// </summary>
/// <param name="base64Str"></param>
/// <returns></returns>
public static string Base64Decode(string base64Str)
{
var bytes = Convert.FromBase64String(base64Str);
return Encoding.UTF8.GetString(bytes);
}
/// <summary>
/// 把对象Base64编码
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string Base64Encode(object obj)
{
var json = Json(obj);
return Base64Encode(json);
}
/// <summary>
/// 从Base64中解析对象
/// </summary>
/// <param name="base64Str"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T? Base64Decode<T>(string base64Str)
{
var json = Base64Decode(base64Str);
return FromJson<T>(json);
}
/// <summary>
/// 将XML字符串序列化为对象
/// </summary>