调整同步数据接口

develop
old易 2024-09-29 16:12:11 +08:00
parent 25cc1b091e
commit 21b51214e1
11 changed files with 378 additions and 138 deletions

View File

@ -95,7 +95,7 @@ namespace New_College.Api.Controllers.Front
var single = singlelist.FirstOrDefault();
if (single != null)
{
updatesync(single.Phone);
// updatesync(single.Phone);
//var custome = new CustomerUpdateQuery()
//{
// StudentId = single.Id,
@ -179,14 +179,18 @@ namespace New_College.Api.Controllers.Front
var result = _services.AuthCode2Session(login.code);
if (result.openid != "" && result.openid != null)
{
var loginstatus = _services.Logined(new LoginQuery() { openId = result.openid }).Result;
var loginstatus = _services.Logined(new LoginQuery() { openId = result.openid, unionId = result.unionid }).Result;
if (loginstatus.Item1)
{
response = loginstatus.Item2;
}
else
{
var save = _services.CustomerSave(new DecryptUserInfoRequest() { openid = result.openid }).Result;
var save = _services.CustomerSave(new DecryptUserInfoRequest()
{
openid = result.openid,
UnionId = result.unionid
}).Result;
response.OpenId = result.openid;
response.Id = save;
}

View File

@ -29,48 +29,6 @@ namespace New_College.Controllers
_CustomerInfoServices = v_CustomerInfoServices;
}
/// <summary>
///三方登录
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
//[Route("login")]
//public async Task<MessageModel<string>> Login([FromQuery] ThridLoginRequestDto dto)
//{
// string token = string.Empty;
// if (dto == null)
// {
// return new MessageModel<string>()
// {
// success = false,
// msg = "参数错误",
// };
// }
// if (ThridConfig.secretKey != dto.secretKey)
// {
// return new MessageModel<string>()
// {
// success = false,
// msg = "密钥错误",
// };
// }
// //首先判断是否存在账户|
// //不存在则创建新的账户|
// //存在则直接登录|
// return new MessageModel<string>()
// {
// msg = "ok",
// success = true,
// response = token
// };
//}
/// <summary>
/// Oauth2验证回调
/// </summary>
@ -85,92 +43,52 @@ namespace New_College.Controllers
var response = new CasDoorToken();
string jwtStr = string.Empty;
bool suc = false;
var getaccesstoken = CasdoorHttpHelper.Http_Post<CasdoorGetTokenResponse>("api/login/oauth/access_token", null, new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(new CasdoorRequest() { code = code, grant_type = "authorization_code", client_id = CasdoorConfig.ClientId, client_secret = CasdoorConfig.ClientSecret }), Encoding.UTF8, "application/json"));//获取access_token
var headers = new System.Collections.Generic.Dictionary<string, string>
{
{ "Authorization", string.Format("Bearer {0}", getaccesstoken.access_token) }
};
if (getaccesstoken.access_token == null)
{
return new MessageModel<CasDoorToken>()
{
msg = "code已失效",
success = false,
status = 401,
};
}
response.servicetoken = getaccesstoken.access_token;
var userinfo = CasdoorHttpHelper.Http_Get<CasdoorUserInfoDto>("/api/userinfo", headers, new Dictionary<string, string>());
var user = (await _CustomerInfoServices.Query(q => q.UUID == userinfo.sub)).FirstOrDefault();
if (user == null)
{
if (!string.IsNullOrWhiteSpace(userinfo.phone))
{
var baseuser = (await _CustomerInfoServices.Query(q => q.Phone == userinfo.phone)).FirstOrDefault();
if (baseuser != null)
var userinfo = CasdoorHttpHelper.Http_Post<JWTSSOResult<MinProWxOutPut>>("/api/syswechat/user_info", null,
new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(
new CasdoorRequest()
{
if (string.IsNullOrEmpty(baseuser.NickName))
{
if (!string.IsNullOrWhiteSpace(baseuser.Phone))
{
baseuser.NickName = baseuser.Phone;
}
}
baseuser.UUID = userinfo.sub;
user = baseuser;
await _CustomerInfoServices.Update(baseuser);
}
else
code = code,
client_id = CasdoorConfig.ClientId,
client_secret = CasdoorConfig.ClientSecret
}),
Encoding.UTF8, "application/json"));//
if (userinfo.code == 200 && userinfo.type == "success")
{
var user = (await _CustomerInfoServices.Query(q => q.UUID == userinfo.result.UnionId)).FirstOrDefault();
if (user != null)
{
//没有用户则注册一个新用户
user = new Model.Models.V_CustomerInfo()
{
//没有用户则注册一个新用户
user = new Model.Models.V_CustomerInfo()
{
IsDelete = false,
UUID = userinfo.sub,
Phone = userinfo.phone,
OpenId = userinfo.aud,
CreateTime = DateTime.UtcNow,
IsVIP = false,
Gender = 0,
Subject = 1
};
user.Id = await _CustomerInfoServices.Add(user);
}
IsDelete = false,
UUID = userinfo.result.UnionId,
Phone = userinfo.result.Mobile,
GZOpenId = userinfo.result.OpenId,
CreateTime = DateTime.UtcNow,
IsVIP = false,
Gender = 0,
Subject = 1,
NickName = userinfo.result.NickName,
ModifyTime = DateTime.UtcNow,
TenantId = userinfo.result.TenantId,
AvatarUrl = userinfo.result.Avatar,
CustomerType = CustomerTypeEnum.General
};
user.Id = await _CustomerInfoServices.Add(user);
}
else
{
return new MessageModel<CasDoorToken>()
{
success = false,
msg = "该账户不存在或已注销"
};
user.GZOpenId = userinfo.result.OpenId;
user.ModifyTime = DateTime.UtcNow;
await _CustomerInfoServices.Update(user);
}
var tokenModel = new SSOTokenModelJwt { UserId = user.Id.ToString(), NickName = user.NickName, LoginMode = LoginModeEnum.APP.ToString() };
jwtStr = JwtHelper.ssoIssueJwt(tokenModel);
response.token = jwtStr;
response.Id = user.Id;
suc = true;
}
else
{
if (string.IsNullOrEmpty(user.NickName))
{
var single = await _CustomerInfoServices.QueryById(user.Id);
if (!string.IsNullOrWhiteSpace(user.Phone))
{
single.NickName = user.Phone;
}
if (!string.IsNullOrWhiteSpace(user.UserCode))
{
single.NickName = user.UserCode;
}
await _CustomerInfoServices.Update(single);
}
}
TokenModelJwt tokenModel = new TokenModelJwt { Uid = user.Id, Role = "users" };
jwtStr = JwtHelper.IssueJwt(tokenModel);
response.token = jwtStr;
response.Id = user.Id;
suc = true;
return new MessageModel<CasDoorToken>()
{
success = suc,

View File

@ -3147,6 +3147,11 @@
小程序openid
</summary>
</member>
<member name="P:New_College.Model.Models.V_CustomerInfo.GZOpenId">
<summary>
公众号openid
</summary>
</member>
<member name="P:New_College.Model.Models.V_CustomerInfo.NickName">
<summary>
用户名
@ -3249,7 +3254,7 @@
</member>
<member name="P:New_College.Model.Models.V_CustomerInfo.UUID">
<summary>
CasdoorId
UnionId
</summary>
</member>
<member name="P:New_College.Model.Models.V_ExaminationPolicy.AreaId">
@ -3529,6 +3534,36 @@
找不到指定资源
</summary>
</member>
<member name="F:New_College.Model.PlatformTypeEnum.微信公众号">
<summary>
微信公众号
</summary>
</member>
<member name="F:New_College.Model.PlatformTypeEnum.微信小程序">
<summary>
微信小程序
</summary>
</member>
<member name="F:New_College.Model.PlatformTypeEnum.QQ">
<summary>
QQ
</summary>
</member>
<member name="F:New_College.Model.PlatformTypeEnum.Alipay">
<summary>
支付宝
</summary>
</member>
<member name="F:New_College.Model.LoginModeEnum.PC">
<summary>
PC模式
</summary>
</member>
<member name="F:New_College.Model.LoginModeEnum.APP">
<summary>
APP
</summary>
</member>
<member name="M:New_College.Model.Seed.DBSeed.SeedAsync(New_College.Model.Seed.MyContext,System.String)">
<summary>
异步添加种子数据
@ -5760,6 +5795,71 @@
选项标签
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.Id">
<summary>
系统用户Id
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.PlatformType">
<summary>
平台类型
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.OpenId">
<summary>
OpenId
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.UnionId">
<summary>
UnionId
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.NickName">
<summary>
昵称
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.Avatar">
<summary>
头像
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.Mobile">
<summary>
手机号码
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.Sex">
<summary>
性别
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.Language">
<summary>
语言
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.City">
<summary>
城市
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.Province">
<summary>
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.Country">
<summary>
国家
</summary>
</member>
<member name="P:New_College.Model.ViewModels.MinProWxOutPut.TenantId">
<summary>
租户Id
</summary>
</member>
<member name="P:New_College.Model.ViewModels.CategoryStatusResult.TestNum">
<summary>
测试次数

View File

@ -116,10 +116,10 @@
}
],
"Audience": {
"Secret": "sdfsdfsrty25634kkhllghtdgdfss345t678fs", //16+
"Secret": "9c1cbc3f546eda35168c3aa3cb91780fbe703f0996c6d123ea96dc85c70bbc0a", //16+
"SecretFile": "", //Secret
"Issuer": "New_College",
"Audience": "wr"
"Issuer": "YCYMEDUCENTER",
"Audience": "YCYMEDUCENTER"
},
"Startup": {
"Cors": {
@ -215,12 +215,12 @@
"endpoint": "https://oss-cn-shanghai.aliyuncs.com"
},
"Casdoor": {
"Endpoint": "http://192.168.104.107:8000",
"Endpoint": "https://api.sso.ycymedu.com",
"OrganizationName": "六纬生涯",
"ApplicationName": "六纬生涯",
"ApplicationType": "webapi",
"ClientId": "776d639918192c449537",
"ClientSecret": "d556f0692052a2df56614282dd86895b04783262",
"ClientId": "18592781518917",
"ClientSecret": "9c1cbc3f546eda35168c3aa3cb91780fbe703f0996c6d123ea96dc85c70bbc0a",
"CallbackPath": "http://test.sso.ycymedu.com/login/oauth/authorize?client_id=776d639918192c449537&response_type=code&redirect_uri=http://192.168.100.106:8080/Home/FirstPage&scope=read&state=casdoor",
"RequireHttpsMetadata": false
},

View File

@ -94,6 +94,61 @@ namespace New_College.AuthHelper.OverWrite
};
return tm;
}
public static string ssoIssueJwt(SSOTokenModelJwt tokenModel)
{
string iss = Appsettings.app(new string[] { "Audience", "Issuer" });
string aud = Appsettings.app(new string[] { "Audience", "Audience" });
string secret = AppSecretConfig.Audience_Secret_String;
//var claims = new Claim[] //old
var claims = new List<Claim>
{
/*
*
1 uid Claim uid Token SerializeJwt() 使
2 HttpContext.User.Claims Policys/PermissionHandler.cs 使
*/
new Claim(JwtRegisteredClaimNames.Jti, tokenModel.UserId.ToString()),
new Claim(JwtRegisteredClaimNames.Iat, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
//这个就是过期时间目前是过期1000秒可自定义注意JWT有自己的缓冲过期时间
new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddDays(7)).ToUnixTimeSeconds()}"),
new Claim(ClaimTypes.Expiration, DateTime.Now.AddDays(1000).ToString()),
new Claim(JwtRegisteredClaimNames.Iss,iss),
new Claim(JwtRegisteredClaimNames.Aud,aud),
new Claim(JwtRegisteredClaimNames.Name,tokenModel.NickName),
//new Claim(ClaimTypes.Role,tokenModel.Role),//为了解决一个用户多个角色(比如Admin,System),用下边的方法
};
// 可以将一个用户的多个角色全部赋予;
// 作者DX 提供技术支持;
// claims.AddRange(tokenModel.Role.Split(',').Select(s => new Claim(ClaimTypes.Role, s)));
//秘钥 (SymmetricSecurityKey 对安全性的要求,密钥的长度太短会报出异常)
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var jwt = new JwtSecurityToken(
issuer: iss,
claims: claims,
signingCredentials: creds);
var jwtHandler = new JwtSecurityTokenHandler();
var encodedJwt = jwtHandler.WriteToken(jwt);
return encodedJwt;
}
}
/// <summary>
@ -115,4 +170,27 @@ namespace New_College.AuthHelper.OverWrite
public string Work { get; set; }
}
public class SSOTokenModelJwt
{
/// <summary>
/// 用户Id
/// </summary>
public string UserId = "UserId";
/// <summary>
/// 昵称
/// </summary>
public string NickName = "NickName";
/// <summary>
/// 登录模式PC、APP
/// </summary>
public string LoginMode = "LoginMode";
}
}

View File

@ -2,6 +2,7 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
namespace New_College.Model.Models
@ -26,6 +27,13 @@ namespace New_College.Model.Models
[SugarColumn(IsNullable = true)]
public string OpenId { get; set; }
/// <summary>
/// 公众号openid
/// </summary>
[SugarColumn(IsNullable = true)]
public string GZOpenId { get; set; }
/// <summary>
/// 用户名
/// </summary>
@ -106,6 +114,7 @@ namespace New_College.Model.Models
public string Subjectgroup { get; set; }
/// <summary>
///
/// </summary>
@ -144,7 +153,7 @@ namespace New_College.Model.Models
/// <summary>
/// CasdoorId
/// UnionId
/// </summary>
[SugarColumn(IsNullable = true)]
public string UUID { get; set; }

View File

@ -7,7 +7,7 @@ namespace New_College.Model.Request
{
public class DecryptUserInfoRequest : GetPhoneInfo
{
public string UnionId { get; set; }
/// <summary>
/// 用户头像
/// </summary>

View File

@ -15,6 +15,9 @@ namespace New_College.Model.Request
/// 退出重新登录时传此值
/// </summary>
public string code { get; set; }
public string unionId { get; set; }
}

View File

@ -20,4 +20,45 @@ namespace New_College.Model
[Description("服务器错误")]
ServerError = 500
}
public enum PlatformTypeEnum
{ /// <summary>
/// 微信公众号
/// </summary>
[Description("微信公众号")]
= 1,
/// <summary>
/// 微信小程序
/// </summary>
[Description("微信小程序")]
= 2,
/// <summary>
/// QQ
/// </summary>
[Description("QQ")]
QQ = 3,
/// <summary>
/// 支付宝
/// </summary>
[Description("支付宝")]
Alipay = 4,
}
public enum LoginModeEnum
{
/// <summary>
/// PC模式
/// </summary>
[Description("PC模式")]
PC = 1,
/// <summary>
/// APP
/// </summary>
[Description("APP")]
APP = 2
}
}

View File

@ -16,11 +16,91 @@ namespace New_College.Model.ViewModels
public string error_description { get; set; }
}
public class JWTSSOResult<T>
{
public int code { get; set; }
public string type { get; set; }
public string message { get; set; }
public T result { get; set; }
public object extras { get; set; }
public string time { get; set; }
}
public class MinProWxOutPut
{
/// <summary>
/// 系统用户Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 平台类型
/// </summary>
public PlatformTypeEnum PlatformType { get; set; } = PlatformTypeEnum.;
/// <summary>
/// OpenId
/// </summary>
public string OpenId { get; set; }
/// <summary>
/// UnionId
/// </summary>
public string? UnionId { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string? NickName { get; set; }
/// <summary>
/// 头像
/// </summary>
public string? Avatar { get; set; }
/// <summary>
/// 手机号码
/// </summary>
public string? Mobile { get; set; }
/// <summary>
/// 性别
/// </summary>
public int? Sex { get; set; }
/// <summary>
/// 语言
/// </summary>
public string? Language { get; set; }
/// <summary>
/// 城市
/// </summary>
public string? City { get; set; }
/// <summary>
/// 省
/// </summary>
public string? Province { get; set; }
/// <summary>
/// 国家
/// </summary>
public string? Country { get; set; }
/// <summary>
/// 租户Id
/// </summary>
public long? TenantId { get; set; }
}
public class CasdoorRequest
{
public string grant_type { get; set; }
//public string grant_type { get; set; }
public string client_id { get; set; }
public string client_secret { get; set; }
public string code { get; set; }

View File

@ -595,10 +595,16 @@ namespace New_College.Services
var userinfo = (await _dal.Query(w => w.OpenId == query.openId && w.IsDelete == false)).ToList().FirstOrDefault();
if (userinfo != null)
{
if (!userinfo.IsVIP)
if (string.IsNullOrWhiteSpace(userinfo.UUID))
{
await SyncXET(userinfo);
userinfo.UUID = query.unionId;
await _dal.Update(userinfo);
}
//if (!userinfo.IsVIP)
//{
// await SyncXET(userinfo);
//}
return new Tuple<bool, CustomerInfoResult>(true, new CustomerInfoResult()
{
AreaId = userinfo.AreaId,
@ -680,7 +686,8 @@ namespace New_College.Services
var i = await _dal.Add(new V_CustomerInfo()
{
OpenId = register.openid,
CustomerType = CustomerTypeEnum.General
CustomerType = CustomerTypeEnum.General,
UUID=register.UnionId
});
return i;
}