.NET開源全面方便的第三方登入元件集合 - MrHuo.OAuth

追逐時光者發表於2023-11-14

前言

我相信做開發的同學應該都對接過各種各樣的第三方平臺的登入授權,來獲取使用者資訊(如:微信登入、支付寶登入、QQ登入、GitHub登入等等)。今天給大家推薦一個.NET開源好用的、全面的、方便第三方登入元件集合框架:MrHuo.OAuth。

專案介紹

MrHuo.OAuth是.NET專案整合OAuth2登入最全面的、最方便的框架,整合了國內外大部分平臺(.NET Core 專案或 .NET Framework 4.6 專案均可使用)。

已支援的第三方平臺

  • 百度
  • 微信公眾號
  • Gitlab
  • Gitee
  • Github
  • 華為
  • Coding.net
  • 新浪微博
  • 支付寶
  • OSChina
  • 迅雷
  • 釘釘內登入
  • 釘釘掃碼登入
  • QQ
  • 微軟
  • 小米
  • StackOverflow
  • Facebook
  • Google

專案原始碼

支付寶登入部分示例程式碼

這裡只展示部分示例程式碼,詳細程式碼請前往原始碼地址檢視:https://github.com/mrhuo/MrHuo.OAuth?

開始之前請閱讀支付寶對接文件

先熟悉流程,對接起來事半功倍:https://opendocs.alipay.com/open/284/106001?

示例程式碼

    /// <summary>
    /// 支付寶回撥URL:
    /// https://oauthlogin.net/oauth/alipaycallback?app_id=2021002122645005&source=alipay_wallet&userOutputs=auth_user&scope=auth_user&alipay_token=&auth_code=2c58e763fdca4fb6b1f5a5bf4d26WA05
    /// https://github.com/alipay/alipay-easysdk/tree/master/csharp
    /// </summary>
    public class AlipayOAuth : OAuthLoginBase<AlipayAccessTokenModel, AlipayUserInfoModel>
    {
        private readonly AlipayApiRequest alipayApiRequest;

        public AlipayOAuth(OAuthConfig oauthConfig, string privateRSAKey, string publicRSAKey, string encryptKey) : base(oauthConfig)
        {
            alipayApiRequest = new AlipayApiRequest()
            {
                PrivateRSAKey = privateRSAKey,
                PublicRSAKey = publicRSAKey,
                AppId = oauthConfig.AppId
            };
        }

        protected override string AuthorizeUrl => "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm";
        protected override string AccessTokenUrl => throw new NotImplementedException();
        protected override string UserInfoUrl => throw new NotImplementedException();

        protected override Dictionary<string, string> BuildAuthorizeParams(string state)
        {
            return new Dictionary<string, string>()
            {
                ["response_type"] = "code",
                ["app_id"] = $"{oauthConfig.AppId}",
                ["redirect_uri"] = $"{oauthConfig.RedirectUri}",
                ["scope"] = $"{oauthConfig.Scope}",
                ["state"] = $"{state}"
            };
        }

        protected override Dictionary<string, string> BuildGetAccessTokenParams(Dictionary<string, string> authorizeCallbackParams)
        {
            return new Dictionary<string, string>()
            {
                ["grant_type"] = "authorization_code",
                ["code"] = authorizeCallbackParams["code"]
            };
        }

        protected override Dictionary<string, string> BuildGetUserInfoParams(AlipayAccessTokenModel accessTokenModel)
        {
            return new Dictionary<string, string>()
            {
                ["auth_token"] = accessTokenModel.AccessToken
            };
        }

        public override async Task<AlipayAccessTokenModel> GetAccessTokenAsync(Dictionary<string, string> authorizeCallbackParams)
        {
            var getAccessTokenResponse = await alipayApiRequest.PostAsync<AlipayApiResponse>(
                "alipay.system.oauth.token", 
                BuildGetAccessTokenParams(authorizeCallbackParams)
            );
            if (getAccessTokenResponse.AccessTokenResponse.SubMsg != null)
            {
                throw new Exception(getAccessTokenResponse.AccessTokenResponse.SubMsg);
            }
            return getAccessTokenResponse.AccessTokenResponse;
        }

        public override async Task<AlipayUserInfoModel> GetUserInfoAsync(AlipayAccessTokenModel accessTokenModel)
        {
            var getUserInfoResponse = await alipayApiRequest.PostAsync<AlipayApiResponse>(
                "alipay.user.info.share",
                BuildGetUserInfoParams(accessTokenModel)
            );
            if (getUserInfoResponse.AlipayUserInfoModel.SubMsg != null)
            {
                throw new Exception(getUserInfoResponse.AlipayUserInfoModel.SubMsg);
            }
            return getUserInfoResponse.AlipayUserInfoModel;
        }
    }

效果預覽

專案原始碼地址

更多專案實用功能和特性歡迎前往專案開源地址檢視?,別忘了給專案一個Star支援?。

https://github.com/mrhuo/MrHuo.OAuth

優秀專案和框架精選

該專案已收錄到C#/.NET/.NET Core優秀專案和框架精選中,關注優秀專案和框架精選能讓你及時瞭解C#、.NET和.NET Core領域的最新動態和最佳實踐,提高開發工作效率和質量。坑已挖,歡迎大家踴躍提交PR推薦或自薦(讓優秀的專案和框架不被埋沒?)。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

加入DotNetGuide技術交流群

1、提供.NET開發者分享自己優質文章的群組和獲取更多全面的C#/.NET/.NET Core學習資料、影片、文章、書籍,社群組織,工具和常見面試題資源,幫助大家更好地瞭解和使用 .NET技術。
2、在這個群裡,開發者們可以分享自己的專案經驗、遇到的問題以及解決方案,傾聽他人的意見和建議,共同成長與進步。
3、可以結識更多志同道合的開發者,甚至可能與其他開發者合作完成有趣的專案。透過這個群組,我們希望能夠搭建一個積極向上、和諧友善的.NET技術交流平臺,為廣大.NET開發者帶來更多的價值。

歡迎加入DotNetGuide技術交流群?

相關文章