Files

226 lines
7.6 KiB
C#
Raw Permalink Normal View History

2026-05-20 09:38:40 +08:00
using System.Collections.Generic;
2026-05-12 09:39:23 +08:00
using System.Net.Http;
using System.Net.Http.Json;
using SimApi.Communications;
using static SimApi.Helpers.SimApiError;
2026-05-20 09:38:40 +08:00
namespace SimApi.AuthSDK;
2026-05-12 09:39:23 +08:00
2026-05-20 09:38:40 +08:00
public class SimApiAuthCenter(SimApiAuthClient simapi)
2026-05-12 09:39:23 +08:00
{
2026-05-20 09:38:40 +08:00
public SimApiAuthClient Client { get; } = simapi;
#region 公共
2026-05-12 09:39:23 +08:00
/// <summary>
/// 委托AuthCenter进行应用签名验证
/// </summary>
/// <param name="appId"></param>
/// <param name="timestamp"></param>
/// <param name="nonce"></param>
/// <param name="sign"></param>
public void VerifySign(string appId, string timestamp, string nonce, string sign)
{
var http = new HttpClient();
2026-05-20 09:38:40 +08:00
var url = $"{Client.Server}/api/auth/sign/verify?appId={appId}&timestamp={timestamp}&nonce={nonce}&sign={sign}";
2026-05-12 09:39:23 +08:00
var result = http.PostAsJsonAsync(url, new { }).Result;
var resp = result.Content.ReadFromJsonAsync<SimApiBaseResponse>().Result;
ErrorWhenNull(resp, 400, "签名验证失败");
ErrorWhenFalse(resp.Code == 200, 400, "签名验证失败");
}
2026-05-20 09:38:40 +08:00
#endregion
#region 群组相关
/// <summary>
/// 根据profileId获取群组列表
/// </summary>
/// <param name="profileId"></param>
/// <returns></returns>
public SimApiAuthCenterDto.GroupRelatedItem[]? GroupRelated(string profileId)
{
return Client.SignQuery<SimApiAuthCenterDto.GroupRelatedItem[]>("/api/auth/group/related", new { profileId });
}
/// <summary>
/// 根据关键字搜索群组,输入群组ID精准搜索
/// </summary>
/// <param name="keyword"></param>
/// <param name="skip"></param>
/// <param name="take"></param>
/// <returns></returns>
public SimApiAuthCenterDto.AppAndProfileItem[]? GroupSearch(string keyword, int skip = 0, int take = 20)
{
return Client.SignQuery<SimApiAuthCenterDto.AppAndProfileItem[]>("/api/auth/group/search",
new { keyword, skip, take });
}
/// <summary>
/// 使用组ID以及组内成员,管理员profile获取组的详细树结构
/// </summary>
/// <param name="profileId"></param>
/// <param name="groupId"></param>
/// <returns></returns>
public SimApiAuthCenterDto.GroupDetailTreeNode? GroupDetail(string groupId, string profileId)
{
return Client.SignQuery<SimApiAuthCenterDto.GroupDetailTreeNode>("/api/auth/group/detail",
new { profileId, groupId });
}
/// <summary>
/// 获取profile在本组的所有子组
/// </summary>
/// <param name="groupId"></param>
/// <param name="profileId"></param>
/// <returns></returns>
public string[]? GroupRelatedIndex(string groupId, string profileId)
{
2026-05-20 09:45:35 +08:00
return Client.SignQuery<string[]>("/api/auth/internal/group/related-group-ids", new { groupId, profileId });
2026-05-20 09:38:40 +08:00
}
#endregion
#region Profile相关
2026-05-12 09:39:23 +08:00
/// <summary>
/// 根据关键字,搜索用户Profile,参数支持精准ID,用户手机号,用户邮箱,Profile名称模糊搜索
/// </summary>
/// <param name="keyword"></param>
/// <param name="skip"></param>
/// <param name="take"></param>
/// <returns></returns>
2026-05-20 09:38:40 +08:00
public SimApiAuthCenterDto.AppAndProfileItem[]? ProfileSearch(string keyword, int skip = 0, int take = 20)
2026-05-12 09:39:23 +08:00
{
2026-05-20 09:38:40 +08:00
return Client.SignQuery<SimApiAuthCenterDto.AppAndProfileItem[]>("/api/auth/profile/search",
2026-05-12 09:39:23 +08:00
new { keyword, skip, take });
}
/// <summary>
/// 通过id,可以批量获取用户的基本信息
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
2026-05-20 09:38:40 +08:00
public SimApiAuthCenterDto.AppAndProfileItem[]? ProfileList(string[] ids)
2026-05-12 09:39:23 +08:00
{
2026-05-20 09:38:40 +08:00
return Client.SignQuery<SimApiAuthCenterDto.AppAndProfileItem[]>("/api/auth/profile/list", new { ids });
2026-05-12 09:39:23 +08:00
}
#endregion
#region AuthGate内部应用专用 - 注意: 只有内部应用可以调用
/// <summary>
/// 获取是否为App的拥有者
/// </summary>
/// <param name="profileId"></param>
/// <param name="applicationId"></param>
/// <returns></returns>
public bool CheckIsAppOwner(string profileId, string applicationId)
{
2026-05-20 09:45:35 +08:00
return Client.SignQuery<bool>("/api/auth/internal/app/check-owner", new
2026-05-12 09:39:23 +08:00
{
ProfileId = profileId,
AppId = applicationId,
});
}
/// <summary>
/// 获取应用列表,根据用户profileId 和 提供的appIds
/// </summary>
/// <param name="profileId"></param>
/// <param name="appIds"></param>
/// <returns></returns>
2026-05-20 09:38:40 +08:00
public SimApiAuthCenterDto.AppAndProfileItem[]? GetAppList(string profileId, IEnumerable<string> appIds)
2026-05-12 09:39:23 +08:00
{
2026-05-20 09:45:35 +08:00
return Client.SignQuery<SimApiAuthCenterDto.AppAndProfileItem[]>("/api/auth/internal/app/related", new
2026-05-12 09:39:23 +08:00
{
ProfileId = profileId,
AllowedAppIds = appIds,
});
}
#endregion
#region 系统登录
/// <summary>
/// 获取登录授权CODE
/// </summary>
/// <param name="scene"></param>
/// <param name="data"></param>
/// <param name="backUrl"></param>
/// <returns></returns>
2026-05-20 09:38:40 +08:00
public SimApiAuthCenterDto.GetCodeResponse GetLoginCode(string? scene = null,
Dictionary<string, object>? data = null,
2026-05-12 09:39:23 +08:00
string? backUrl = null)
{
2026-05-20 09:38:40 +08:00
var code = Client.SignQuery<string>("/api/auth/login/code",
2026-05-12 09:39:23 +08:00
new { scene, data, backUrl });
2026-05-20 09:38:40 +08:00
return new SimApiAuthCenterDto.GetCodeResponse()
2026-05-12 09:39:23 +08:00
{
Code = code!,
2026-05-20 09:38:40 +08:00
Server = Client.Server,
FullUrl = $"{Client.Server}/auth?code={code}"
2026-05-12 09:39:23 +08:00
};
}
/// <summary>
/// 使用code获取登录信息
/// </summary>
/// <param name="code"></param>
/// <param name="scene"></param>
/// <returns></returns>
2026-05-20 09:38:40 +08:00
public SimApiAuthCenterDto.LoginInfoResponse GetLoginInfo(string code, string? scene = null)
2026-05-12 09:39:23 +08:00
{
2026-05-20 09:38:40 +08:00
var resp = Client.SignQuery<SimApiAuthCenterDto.LoginInfoResponse>("/api/auth/login/get", new { code });
2026-05-12 09:39:23 +08:00
ErrorWhenNull(resp, 400232, "登录信息获取失败");
ErrorWhen(resp.Scene != scene, 403003, "登录场景不匹配");
return resp;
}
#endregion
#region 安全验证
/// <summary>
/// 获取安全验证代码
/// </summary>
/// <param name="scene"></param>
/// <param name="userId"></param>
/// <param name="data"></param>
/// <param name="backUrl"></param>
/// <returns></returns>
2026-05-20 09:38:40 +08:00
public SimApiAuthCenterDto.GetCodeResponse GetConfirmCode(string scene, string userId,
2026-05-12 09:39:23 +08:00
Dictionary<string, object>? data = null,
string? backUrl = null)
{
2026-05-20 09:38:40 +08:00
var code = Client.SignQuery<string>("/api/auth/confirm/code",
2026-05-12 09:39:23 +08:00
new { scene, data, backUrl, profileId = userId });
2026-05-20 09:38:40 +08:00
return new SimApiAuthCenterDto.GetCodeResponse()
2026-05-12 09:39:23 +08:00
{
Code = code!,
2026-05-20 09:38:40 +08:00
Server = Client.Server,
FullUrl = $"{Client.Server}/confirm?code={code}"
2026-05-12 09:39:23 +08:00
};
}
/// <summary>
/// 使用安全验证code 获取验证结果
/// </summary>
/// <param name="code"></param>
/// <param name="scene"></param>
/// <param name="userId"></param>
/// <returns></returns>
2026-05-20 09:38:40 +08:00
public SimApiAuthCenterDto.ConfirmResponse Confirm(string code, string scene, string? userId = null)
2026-05-12 09:39:23 +08:00
{
2026-05-20 09:38:40 +08:00
var resp = Client.SignQuery<SimApiAuthCenterDto.ConfirmResponse>("/api/auth/confirm/get", new { code });
2026-05-12 09:39:23 +08:00
ErrorWhenNull(resp, 403001, "安全确认码无效");
ErrorWhen(resp.ProfileId != userId, 403002, "安全确认身份不匹配");
ErrorWhen(resp.Scene != scene, 403003, "安全确认场景不匹配");
return resp;
}
#endregion
}