补充ABP Zero集成微信小程序登陆的BUG修复部分

感谢园友 @turingguo 发布的 https://www.cnblogs.com/turingguo/p/9019026.html  文章,详细介绍了ABP Zero集成微信小程序登陆的实现过程。

经测试,abp的外部登陆有几处bug,在此做记录。

1、xxxxWebHostModule.cs文件

 1         public override void PostInitialize()
 2         {
 3
 4             if (!IocManager.Resolve<IMultiTenancyConfig>().IsEnabled)
 5             {
 6                 return;
 7             }
 8
 9             if (!DatabaseCheckHelper.Exist(_appConfiguration["ConnectionStrings:Default"]))
10             {
11                 return;
12             }
13
14             var workManager = IocManager.Resolve<IBackgroundWorkerManager>();
15             workManager.Add(IocManager.Resolve<SubscriptionExpirationCheckWorker>());
16             workManager.Add(IocManager.Resolve<SubscriptionExpireEmailNotifierWorker>());
17
18             ConfigureExternalAuthProviders();
19         }

当启用多租户模式的情况下,租主站点没有将外部登陆的provider添加到集合中。

不未启用多租户模式时,第四行的逻辑判断又给跳过了。

因此将18行代码调整到第3行。

2、TokenAuthController文件

 1 public async Task<ExternalAuthenticateResultModel> ExternalAuthenticate([FromBody] ExternalAuthenticateModel model)
 2         {
 3             var externalUser = await GetExternalUserInfo(model);
 4
 5             var loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, externalUser.ProviderKey, model.AuthProvider), GetTenancyNameOrNull());
 6
 7             switch (loginResult.Result)
 8             {
 9                 case AbpLoginResultType.Success:
10                     {
11                         var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
12
13                         var returnUrl = model.ReturnUrl;
14
15                         if (model.SingleSignIn.HasValue && model.SingleSignIn.Value && loginResult.Result == AbpLoginResultType.Success)
16                         {
17                             loginResult.User.SetSignInToken();
18                             returnUrl = AddSingleSignInParametersToReturnUrl(model.ReturnUrl, loginResult.User.SignInToken, loginResult.User.Id, loginResult.User.TenantId);
19                         }
20
21                         return new ExternalAuthenticateResultModel
22                         {
23                             AccessToken = accessToken,
24                             EncryptedAccessToken = GetEncrpyedAccessToken(accessToken),
25                             ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds,
26                             ReturnUrl = returnUrl
27                         };
28                     }
29                 case AbpLoginResultType.UnknownExternalLogin:
30                     {
31                         var newUser = await RegisterExternalUserAsync(externalUser);
32                         if (!newUser.IsActive)
33                         {
34                             return new ExternalAuthenticateResultModel
35                             {
36                                 WaitingForActivation = true
37                             };
38                         }
39
40                         //Try to login again with newly registered user!
41                         loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, externalUser.ProviderKey, model.AuthProvider), GetTenancyNameOrNull());
42                         if (loginResult.Result != AbpLoginResultType.Success)
43                         {
44                             throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(
45                                 loginResult.Result,
46                                 model.ProviderKey,
47                                 GetTenancyNameOrNull()
48                             );
49                         }
50
51                         var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
52                         return new ExternalAuthenticateResultModel
53                         {
54                             AccessToken = accessToken,
55                             EncryptedAccessToken = GetEncrpyedAccessToken(accessToken),
56                             ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds
57                         };
58                     }
59                 default:
60                     {
61                         throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(
62                             loginResult.Result,
63                             model.ProviderKey,
64                             GetTenancyNameOrNull()
65                         );
66                     }
67             }
68         }

分别在第5行和41行,是用户外部登陆的过程。该两行代码的BUG是,登陆时使用了微信的accessCode当作providerKey登陆,方法是将 await GetExternalUserInfo(model) 返回的ProviderKey做为用户登陆就可以了。(以上代码是修改后的代码)

原文地址:https://www.cnblogs.com/webdu/p/9124490.html

时间: 2024-08-07 16:13:38

补充ABP Zero集成微信小程序登陆的BUG修复部分的相关文章

ABP Zero集成微信小程序登陆

首先是ABPZero的第三方登陆模块,通过调用第三方的登录接口返回用户信息,再交给ABP的登陆验证模块去执行对应的登陆注册. 涉及的数据库表主要是这两个表,AbpUsers存储了用户信息,AbpUserLogins存储了登陆方式,第三方登陆的信息就是存储在这里的 主要是四个字段 LoginProvider ProviderKey TenantId UserId 登陆提供器   用户唯一Id  对应的租户Id和用户Id 首先需要编写一个LoginProvider,代码如下 using System

微信小程序-登陆、支付、模板消息

wx.login(OBJECT) 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要依赖会话密钥完成. OBJECT参数说明: success返回参数说明: 示例代码: //app.js App({ onLaunch: function() { wx.login({ success: function(res) { if (res.code) { //发起网络请求 wx.reque

我感觉这个书上的微信小程序登陆写得不好

基本功能是OK,但是感觉传的数据太多,不安全,需要改写. App({ d: { hostUrl: 'http://www.test.com/index.php', //请填写您自己的小程序主机URL appId: "xxx", appKey: "xxx", ceshiUrl: 'http://www.test.com/index.php',//请填写您自己的测试URL }, //小程序初始化完成时触发,全局只触发一次 onLaunch: function () {

[小程序]微信小程序登陆并获取用户信息

1.小程序js端调用框架登陆API,获取到一个临时code,拿着这个code去调用自己的服务端接口 2.在自己的服务器端,使用app_id app_secrect code可以获取到用户的openid,这个id是用户唯一的id并且不会改变,可以把这个id返回给小程序端小程序端本地保存openid 3.获取用户信息很简单,并且不需要自己的服务器处理,只需要小程序端提供的API.前端页面wxml使用一个按钮,按钮里增加几个属性,就可以回调到小程序js部分的方法上,并且带着用户的个人信息,如昵称 头像

微信小程序如何像vue一样在动态绑定类名

微信小程序如何像vue一样在动态绑定类名 更新时间:2018年04月17日 14:08:44 这篇文章主要介绍了微信小程序如何像vue一样在动态绑定类名,文中给大家提到了vue与微信小程序的区别,需要的朋友可以参考下 小程序 开发中遇到这样一个问题... 排行榜开发的时候,前三名的样式不同,其余的样式一样.但是都是通过同一元素来遍历的,当时卡了一下.后来发现有module模块化这一概念,于是查了下api,一下子就做出来了. 就是不同名次上边的样式根据实际情况展示效果. 模块化 我们可以将一些公共

从session原理出发解决微信小程序的登陆问题

原理知识准备  对于已经熟悉了session原理的同学来说,我们都清楚:在浏览器端我们会存储一个sessionId,用它来作为凭证,在服务器端得到有关本次浏览器与服务器会话的所有信息,这些信息是储存在服务器端的存储空间中的,它完全可以用来判断一个浏览器端的登录状态,因为它是由服务器端来掌控的,是安全的. 那么浏览器端是用什么来存储这个sessionId? 并且浏览器又是如何将sessionId传回给服务器的呢? 大体上是有两种方法的: 1.使用浏览器端实现的cookie功能,每次浏览器都会将服务

微信小程序 使用HMACSHA1和md5为登陆注册报文添加指纹验证签名

对接口请求报文作指纹验证签名相信在开发中经常碰到, 这次在与java后端一起开发小程序时,就碰到需求对登陆注册请求报文添加指纹验证签名来防止信息被修改 先来看下我们与后端定制签名规则 2.4. 签名规则 原文规则:采用标准的JSON格式,null值字段舍去,按照key值字符串升序排列 例如:{"appId":"1100310061380986","outTradeNo":"1515120685073","timest

微信小程序之微信登陆 —— 微信小程序教程系列(20)

简介: 微信登陆,在新建一个微信小程序Hello World项目的时候,就可以看到项目中出现了我们的微信头像,其实这个Hello World项目,就有一个简化版的微信登陆.只不过是,还没有写入到咱们自家的后台中而已. 新建一个Hello World项目,找到app.js文件打开,代码如下: app.js: App({ onLaunch: function () { //调用API从本地缓存中获取数据 var logs = wx.getStorageSync('logs') || [] logs.

SAP成都研究院大卫哥:SAP C4C中国本地化之微信小程序集成

今天的文章来自Wu David,SAP成都研究院C4C开发团队的架构师,在加入团队之前曾经在SAP上海研究院工作,组内同事习惯亲切地称呼他为大卫哥. 大卫哥身高据Jerry目测有1米8以上,是成都C4C开发团队身高最高的几位男同事之一.身体非常结实,是成都SAP篮球队的成员之一.有一次大卫哥坐在自己座位上,一手撑在桌子上认真地看着向他求助的同事电脑上打印的日志,飞机哥张航拍了一张大卫哥的背影,评价道:"从照片里看出了大卫哥发达的背阔肌." 飞机哥张航后来完成了一幅素描,下图左边正在沉思