.net core 3.1 實現微信小程序登錄

庫版本.net core 3.1

我的abp版本:abp5.3 .net core 3.1

請先看微信小程序官方文檔。下面說說abp中如何使用。原生asp.net core可以參考實現

回到頂部

服務端配置

1、安裝nuget包

<code>Install-Package BXJG.WeChart -Version 1.0.0/<code>

2、修改配置文件 abp.web.host/appsettings.json

.net core 3.1 實現微信小程序登錄


3、修改啟動配置類abp.web.host//StartupAuthConfigurer.cs

因為startup中是通過這個類中的靜態方法註冊身份驗證相關服務的

.net core 3.1 實現微信小程序登錄

View Code

更多配置請參考視頻

4、實現abp集成

找到abp.web.core/controllers/TokenAuthController

先注入UserManager

.net core 3.1 實現微信小程序登錄


然後添加下面的方法

<code> 1         [HttpPost]
2 public async Task<externalauthenticateresultmodel> WeChartMiniProgramLoginAsync()
3 {
4
5 //從第三方登錄拿到當前用戶(包含openId、sessionKey)
6 var t = await base.HttpContext.AuthenticateAsync(MiniProgramConsts.AuthenticationScheme);//間接使用第三方身份驗證方案獲取信息
7 //拿到openId
8 var openid = t.Principal.Claims.Single(c => c.Type == ClaimTypes.NameIdentifier).Value;
9 var tenancyName = GetTenancyNameOrNull();
10 //嘗試做第三發登錄(內部通過openid找到本地賬號做登錄),
11 var loginResult = await _logInManager.LoginAsync(new UserLoginInfo(MiniProgramConsts.AuthenticationScheme, openid, MiniProgramConsts.AuthenticationSchemeDisplayName), tenancyName);
12 //根據登錄結果,若成功則直接返回jwtToken 或者自動註冊後返回
13 switch (loginResult.Result)
14 {
15 case AbpLoginResultType.Success:
16 {
17 //更新微信用戶信息
18 foreach (var item in t.Principal.Claims)
19 {
20 await userManager.ReplaceClaimAsync(loginResult.User, new Claim(item.Type, ""), item);
21 }
22
23 //返回jwtToken
24 var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
25 return new ExternalAuthenticateResultModel
26 {
27 AccessToken = accessToken,
28 EncryptedAccessToken = GetEncryptedAccessToken(accessToken),
29 ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds
30 };
31 }
32 case AbpLoginResultType.UnknownExternalLogin:
33 {
34 //若未找到關聯的本地賬號則自動註冊,再返回jwtToken
35 var newUser = await RegisterExternalUserAsync(new ExternalAuthUserInfo
36 {
37 Provider = MiniProgramConsts.AuthenticationScheme,
38 ProviderKey = openid,

39 Name = t.Principal.Claims.SingleOrDefault(c => c.Type == "nickName")?.Value,
40 EmailAddress = Guid.NewGuid().ToString("N") + "@mp.com",
41 Surname = "a"
42 });
43 if (!newUser.IsActive)
44 {
45 return new ExternalAuthenticateResultModel
46 {
47 WaitingForActivation = true
48 };
49 }
50
51 // Try to login again with newly registered user!
52 loginResult = await _logInManager.LoginAsync(new UserLoginInfo(MiniProgramConsts.AuthenticationScheme, openid, MiniProgramConsts.AuthenticationSchemeDisplayName), tenancyName);
53 if (loginResult.Result != AbpLoginResultType.Success)
54 {
55 throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(
56 loginResult.Result,
57 openid,
58 tenancyName
59 );
60 }
61 //保存微信用戶信息(排出openid,因為它存儲在userlogins裡)
62 await userManager.AddClaimsAsync(loginResult.User, t.Principal.Claims.Where(c=>c.Type!= ClaimTypes.NameIdentifier));
63
64 return new ExternalAuthenticateResultModel
65 {
66 AccessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity)),
67 ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds
68 };
69 }
70 default:
71 {
72 throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(
73 loginResult.Result,
74 openid,
75 tenancyName
76 );
77 }
78 }
79 }/<externalauthenticateresultmodel>/<code>
.net core 3.1 實現微信小程序登錄

回到頂部

小程序端處理

小程序調用wx.login拿到code,然後調用wx.getUserInfo拿到用戶暱稱、頭像、性別.....等數據

將上面的數據組成json Post提交到 我方服務器/wechart-miniProgram-signin

此時會返回一個加密的cookie字符串,小程序端需要想法從響應的cookie中拿到此字符串

用上面的字符串作為cookie Post請求 我方服務器/api/TokenAuth/WeChartMiniProgramLogin

此時服務端會返回jwtToken

後續請求跟之前的處理就一樣了。


分享到:


相關文章: