AbpZero之企业微信---登录(拓展第三方auth授权登录)---第一步:查看AbpZero的auth第三方登录的底层机制

在AbpZero框架中,auth登录接口位于Web.Core库下的Controllers文件夹的TokenAuthController.csExternalAuthenticate方法

 

ExternalAuthenticate方法的代码如下:

 1   [HttpPost]
 2         public async Task<ExternalAuthenticateResultModel> ExternalAuthenticate([FromBody] ExternalAuthenticateModel model)
 3         {
 4             var externalUser = await GetExternalUserInfo(model);
 5 
 6             var loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, model.ProviderKey, model.AuthProvider), GetTenancyNameOrNull());
 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, model.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         }
View Code

我们查看 GetExternalUserInfo下面的方法,发现它是已经封装成了Abp.AspNetZeroCore.Web.dll,我们用反编译工具可以看到对应的代码

随便拿个谷歌的auth登录看下

 1 using System;
 2 using System.Net.Http;
 3 using System.Net.Http.Headers;
 4 using System.Threading.Tasks;
 5 using Microsoft.AspNetCore.Authentication.Google;
 6 using Newtonsoft.Json.Linq;
 7 
 8 namespace Abp.AspNetZeroCore.Web.Authentication.External.Google
 9 {
10     // Token: 0x02000010 RID: 16
11     public class GoogleAuthProviderApi : ExternalAuthProviderApiBase
12     {
13         // Token: 0x06000036 RID: 54 RVA: 0x0000244C File Offset: 0x0000064C
14         public override async Task<ExternalAuthUserInfo> GetUserInfo(string accessCode)
15         {
16             ExternalAuthUserInfo result;
17             using (HttpClient client = new HttpClient())
18             {
19                 client.DefaultRequestHeaders.UserAgent.ParseAdd("Microsoft ASP.NET Core OAuth middleware");
20                 client.DefaultRequestHeaders.Accept.ParseAdd("application/json");
21                 client.Timeout = TimeSpan.FromSeconds(30.0);
22                 client.MaxResponseContentBufferSize = 10485760L;
23                 HttpResponseMessage httpResponseMessage = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, GoogleDefaults.UserInformationEndpoint)
24                 {
25                     Headers = 
26                     {
27                         Authorization = new AuthenticationHeaderValue("Bearer", accessCode)
28                     }
29                 });
30                 httpResponseMessage.EnsureSuccessStatusCode();
31                 JObject user = JObject.Parse(await httpResponseMessage.Content.ReadAsStringAsync());
32                 result = new ExternalAuthUserInfo
33                 {
34                     Name = GoogleHelper.GetName(user),
35                     EmailAddress = GoogleHelper.GetEmail(user),
36                     Surname = GoogleHelper.GetFamilyName(user),
37                     ProviderKey = GoogleHelper.GetId(user),
38                     Provider = "Google"
39                 };
40             }
41             return result;
42         }
43 
44         // Token: 0x04000010 RID: 16
45         public const string Name = "Google";
46     }
47 }
View Code

发现auth登录都是继承于ExternalAuthProviderApiBase

篇幅太长,下回分解。

 

猜你喜欢

转载自www.cnblogs.com/LmuQuan/p/9122143.html