zoukankan      html  css  js  c++  java
  • 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

    篇幅太长,下回分解。

    
    
  • 相关阅读:
    DOPE:基于蒸馏网络的全身三维姿态估计
    3D人体姿态重构
    Nginx+gunicorn+flask+docker算法部署
    MediaPipe中Box Tracking技术原理
    C++线程池
    MediaPipe加速流程和原理
    记一次illegal instruction问题定位
    如何阅读大工程代码(clickhouse版)
    zookeeper client原理总结
    go package依赖图自动生成
  • 原文地址:https://www.cnblogs.com/LmuQuan/p/9122143.html
Copyright © 2011-2022 走看看