调整同步数据接口

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(); var single = singlelist.FirstOrDefault();
if (single != null) if (single != null)
{ {
updatesync(single.Phone); // updatesync(single.Phone);
//var custome = new CustomerUpdateQuery() //var custome = new CustomerUpdateQuery()
//{ //{
// StudentId = single.Id, // StudentId = single.Id,
@ -179,14 +179,18 @@ namespace New_College.Api.Controllers.Front
var result = _services.AuthCode2Session(login.code); var result = _services.AuthCode2Session(login.code);
if (result.openid != "" && result.openid != null) 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) if (loginstatus.Item1)
{ {
response = loginstatus.Item2; response = loginstatus.Item2;
} }
else 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.OpenId = result.openid;
response.Id = save; response.Id = save;
} }

View File

@ -29,48 +29,6 @@ namespace New_College.Controllers
_CustomerInfoServices = v_CustomerInfoServices; _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> /// <summary>
/// Oauth2验证回调 /// Oauth2验证回调
/// </summary> /// </summary>
@ -85,92 +43,52 @@ namespace New_College.Controllers
var response = new CasDoorToken(); var response = new CasDoorToken();
string jwtStr = string.Empty; string jwtStr = string.Empty;
bool suc = false; 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 userinfo = CasdoorHttpHelper.Http_Post<JWTSSOResult<MinProWxOutPut>>("/api/syswechat/user_info", null,
var headers = new System.Collections.Generic.Dictionary<string, string> new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(
{ new CasdoorRequest()
{ "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)
{ {
if (string.IsNullOrEmpty(baseuser.NickName)) code = code,
{ client_id = CasdoorConfig.ClientId,
client_secret = CasdoorConfig.ClientSecret
if (!string.IsNullOrWhiteSpace(baseuser.Phone)) }),
{ Encoding.UTF8, "application/json"));//
baseuser.NickName = baseuser.Phone; if (userinfo.code == 200 && userinfo.type == "success")
} {
} var user = (await _CustomerInfoServices.Query(q => q.UUID == userinfo.result.UnionId)).FirstOrDefault();
baseuser.UUID = userinfo.sub; if (user != null)
user = baseuser; {
await _CustomerInfoServices.Update(baseuser); //没有用户则注册一个新用户
} user = new Model.Models.V_CustomerInfo()
else
{ {
//没有用户则注册一个新用户 IsDelete = false,
UUID = userinfo.result.UnionId,
user = new Model.Models.V_CustomerInfo() Phone = userinfo.result.Mobile,
{ GZOpenId = userinfo.result.OpenId,
IsDelete = false, CreateTime = DateTime.UtcNow,
UUID = userinfo.sub, IsVIP = false,
Phone = userinfo.phone, Gender = 0,
OpenId = userinfo.aud, Subject = 1,
CreateTime = DateTime.UtcNow, NickName = userinfo.result.NickName,
IsVIP = false, ModifyTime = DateTime.UtcNow,
Gender = 0, TenantId = userinfo.result.TenantId,
Subject = 1 AvatarUrl = userinfo.result.Avatar,
}; CustomerType = CustomerTypeEnum.General
user.Id = await _CustomerInfoServices.Add(user); };
user.Id = await _CustomerInfoServices.Add(user);
}
} }
else else
{ {
return new MessageModel<CasDoorToken>() user.GZOpenId = userinfo.result.OpenId;
{ user.ModifyTime = DateTime.UtcNow;
success = false, await _CustomerInfoServices.Update(user);
msg = "该账户不存在或已注销"
};
} }
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>() return new MessageModel<CasDoorToken>()
{ {
success = suc, success = suc,

View File

@ -3147,6 +3147,11 @@
小程序openid 小程序openid
</summary> </summary>
</member> </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"> <member name="P:New_College.Model.Models.V_CustomerInfo.NickName">
<summary> <summary>
用户名 用户名
@ -3249,7 +3254,7 @@
</member> </member>
<member name="P:New_College.Model.Models.V_CustomerInfo.UUID"> <member name="P:New_College.Model.Models.V_CustomerInfo.UUID">
<summary> <summary>
CasdoorId UnionId
</summary> </summary>
</member> </member>
<member name="P:New_College.Model.Models.V_ExaminationPolicy.AreaId"> <member name="P:New_College.Model.Models.V_ExaminationPolicy.AreaId">
@ -3529,6 +3534,36 @@
找不到指定资源 找不到指定资源
</summary> </summary>
</member> </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)"> <member name="M:New_College.Model.Seed.DBSeed.SeedAsync(New_College.Model.Seed.MyContext,System.String)">
<summary> <summary>
异步添加种子数据 异步添加种子数据
@ -5760,6 +5795,71 @@
选项标签 选项标签
</summary> </summary>
</member> </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"> <member name="P:New_College.Model.ViewModels.CategoryStatusResult.TestNum">
<summary> <summary>
测试次数 测试次数

View File

@ -116,10 +116,10 @@
} }
], ],
"Audience": { "Audience": {
"Secret": "sdfsdfsrty25634kkhllghtdgdfss345t678fs", //16+ "Secret": "9c1cbc3f546eda35168c3aa3cb91780fbe703f0996c6d123ea96dc85c70bbc0a", //16+
"SecretFile": "", //Secret "SecretFile": "", //Secret
"Issuer": "New_College", "Issuer": "YCYMEDUCENTER",
"Audience": "wr" "Audience": "YCYMEDUCENTER"
}, },
"Startup": { "Startup": {
"Cors": { "Cors": {
@ -215,12 +215,12 @@
"endpoint": "https://oss-cn-shanghai.aliyuncs.com" "endpoint": "https://oss-cn-shanghai.aliyuncs.com"
}, },
"Casdoor": { "Casdoor": {
"Endpoint": "http://192.168.104.107:8000", "Endpoint": "https://api.sso.ycymedu.com",
"OrganizationName": "六纬生涯", "OrganizationName": "六纬生涯",
"ApplicationName": "六纬生涯", "ApplicationName": "六纬生涯",
"ApplicationType": "webapi", "ApplicationType": "webapi",
"ClientId": "776d639918192c449537", "ClientId": "18592781518917",
"ClientSecret": "d556f0692052a2df56614282dd86895b04783262", "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", "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 "RequireHttpsMetadata": false
}, },

View File

@ -94,6 +94,61 @@ namespace New_College.AuthHelper.OverWrite
}; };
return tm; 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> /// <summary>
@ -115,4 +170,27 @@ namespace New_College.AuthHelper.OverWrite
public string Work { get; set; } 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 SqlSugar;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text; using System.Text;
namespace New_College.Model.Models namespace New_College.Model.Models
@ -26,6 +27,13 @@ namespace New_College.Model.Models
[SugarColumn(IsNullable = true)] [SugarColumn(IsNullable = true)]
public string OpenId { get; set; } public string OpenId { get; set; }
/// <summary>
/// 公众号openid
/// </summary>
[SugarColumn(IsNullable = true)]
public string GZOpenId { get; set; }
/// <summary> /// <summary>
/// 用户名 /// 用户名
/// </summary> /// </summary>
@ -106,6 +114,7 @@ namespace New_College.Model.Models
public string Subjectgroup { get; set; } public string Subjectgroup { get; set; }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -144,7 +153,7 @@ namespace New_College.Model.Models
/// <summary> /// <summary>
/// CasdoorId /// UnionId
/// </summary> /// </summary>
[SugarColumn(IsNullable = true)] [SugarColumn(IsNullable = true)]
public string UUID { get; set; } public string UUID { get; set; }

View File

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

View File

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

View File

@ -20,4 +20,45 @@ namespace New_College.Model
[Description("服务器错误")] [Description("服务器错误")]
ServerError = 500 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 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 class CasdoorRequest
{ {
public string grant_type { get; set; } //public string grant_type { get; set; }
public string client_id { get; set; } public string client_id { get; set; }
public string client_secret { get; set; } public string client_secret { get; set; }
public string code { 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(); var userinfo = (await _dal.Query(w => w.OpenId == query.openId && w.IsDelete == false)).ToList().FirstOrDefault();
if (userinfo != null) 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() return new Tuple<bool, CustomerInfoResult>(true, new CustomerInfoResult()
{ {
AreaId = userinfo.AreaId, AreaId = userinfo.AreaId,
@ -680,7 +686,8 @@ namespace New_College.Services
var i = await _dal.Add(new V_CustomerInfo() var i = await _dal.Add(new V_CustomerInfo()
{ {
OpenId = register.openid, OpenId = register.openid,
CustomerType = CustomerTypeEnum.General CustomerType = CustomerTypeEnum.General,
UUID=register.UnionId
}); });
return i; return i;
} }