第三方OAuth受權登陸git
三方 | 參考文檔 |
---|---|
![]() |
參考文檔 |
![]() |
參考文檔 |
![]() |
參考文檔 |
![]() |
參考文檔 |
![]() |
參考文檔 |
![]() |
參考文檔 |
![]() |
參考文檔 |
![]() |
參考文檔 |
![]() |
參考文檔 |
![]() |
參考文檔 |
![]() |
參考文檔 |
Install-Package Netnr.Login
修改配置信息(密鑰、回調等)github
提醒:通常全部第三方登陸都有一個 state 參數,用於防止CSRF攻擊(防僞),能夠利用該參數添加 登陸、註冊 的標註前綴c#
/* * 這是測試代碼,只爲調通每個接口,拿到 惟一標識 * 實際應用中還要處理暱稱、郵箱、頭像等,可參考個站開源項目:https://github.com/netnr/blog */ using System; namespace Netnr.Login.Sample { class Program { static void Main(string[] args) { var lc = new LoginClient(LoginBase.LoginType.StackOverflow); //拷貝受權連接在瀏覽器打開,受權後拿到code,並手動賦值,手動賦值需解碼 var url = lc.Auth(); var ar = new LoginBase.AuthorizeResult(); ar.code = ""; //此處打斷點,賦值上面拿到的code再繼續 ar.code = ar.code.ToDecode(); lc.AuthCallback(ar); } public class LoginClient { private LoginBase.LoginType? loginType; public LoginClient(LoginBase.LoginType _loginType) { loginType = _loginType; // 配置 QQConfig.APPID = "XXX"; QQConfig.APPKey = "XXX"; //回調地址,與申請填寫的地址保持一致 QQConfig.Redirect_Uri = "https://rf2.netnr.com/account/authcallback/qq"; WeChatConfig.AppId = ""; WeChatConfig.AppSecret = ""; WeChatConfig.Redirect_Uri = ""; WeiboConfig.AppKey = ""; WeiboConfig.AppSecret = ""; WeiboConfig.Redirect_Uri = ""; GitHubConfig.ClientID = ""; GitHubConfig.ClientSecret = ""; GitHubConfig.Redirect_Uri = ""; //申請的應用名稱,很是重要 GitHubConfig.ApplicationName = "netnrf"; TaoBaoConfig.AppKey = ""; TaoBaoConfig.AppSecret = ""; TaoBaoConfig.Redirect_Uri = ""; MicroSoftConfig.ClientID = ""; MicroSoftConfig.ClientSecret = ""; MicroSoftConfig.Redirect_Uri = ""; DingTalkConfig.appId = ""; DingTalkConfig.appSecret = ""; DingTalkConfig.Redirect_Uri = ""; GiteeConfig.ClientID = ""; GiteeConfig.ClientSecret = ""; GiteeConfig.Redirect_Uri = ""; GoogleConfig.ClientID = ""; GoogleConfig.ClientSecret = ""; GoogleConfig.Redirect_Uri = ""; AliPayConfig.AppId = ""; AliPayConfig.AppPrivateKey = ""; AliPayConfig.Redirect_Uri = ""; StackOverflowConfig.ClientId = ""; StackOverflowConfig.ClientSecret = ""; StackOverflowConfig.Key = ""; StackOverflowConfig.Redirect_Uri = ""; } /// <summary> /// 生成請求連接 /// </summary> /// <param name="authType">在防僞參數追加信息(可用於登陸、註冊、綁定、解綁區分)</param> /// <returns></returns> public string Auth(string authType = "") { var url = string.Empty; switch (loginType) { case LoginBase.LoginType.QQ: { var reqe = new QQ_Authorization_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = QQ.AuthorizationHref(reqe); } break; case LoginBase.LoginType.WeiBo: { var reqe = new Weibo_Authorize_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = Weibo.AuthorizeHref(reqe); } break; case LoginBase.LoginType.GitHub: { var reqe = new GitHub_Authorize_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = GitHub.AuthorizeHref(reqe); } break; case LoginBase.LoginType.TaoBao: { var reqe = new TaoBao_Authorize_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = TaoBao.AuthorizeHref(reqe); } break; case LoginBase.LoginType.MicroSoft: { var reqe = new MicroSoft_Authorize_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = MicroSoft.AuthorizeHref(reqe); } break; case LoginBase.LoginType.WeChat: { var reqe = new WeChat_Authorization_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = WeChat.AuthorizationHref(reqe); } break; case LoginBase.LoginType.DingTalk: { var reqe = new DingTalk_Authorize_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } //掃描模式 url = DingTalk.AuthorizeHref_ScanCode(reqe); //密碼模式 //url = DingTalk.AuthorizeHref_Password(reqe); } break; case LoginBase.LoginType.Gitee: { var reqe = new Gitee_Authorize_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = Gitee.AuthorizeHref(reqe); } break; case LoginBase.LoginType.Google: { var reqe = new Google_Authorize_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = Google.AuthorizeHref(reqe); } break; case LoginBase.LoginType.AliPay: { var reqe = new AliPay_Authorize_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = AliPay.AuthorizeHref(reqe); } break; case LoginBase.LoginType.StackOverflow: { var reqe = new StackOverflow_Authorize_RequestEntity(); if (!string.IsNullOrWhiteSpace(authType)) { reqe.state = authType + reqe.state; } url = StackOverflow.AuthorizeHref(reqe); } break; } return url; } /// <summary> /// 回調方法 /// </summary> /// <param name="authorizeResult">接收受權碼、防僞參數</param> public void AuthCallback(LoginBase.AuthorizeResult authorizeResult) { if (string.IsNullOrWhiteSpace(authorizeResult.code)) { //打開連接沒登陸受權 } else { //惟一標示 string OpenId = string.Empty; switch (loginType) { case LoginBase.LoginType.QQ: { //獲取 access_token var tokenEntity = QQ.AccessToken(new QQ_AccessToken_RequestEntity() { code = authorizeResult.code }); //獲取 OpendId var openidEntity = QQ.OpenId(new QQ_OpenId_RequestEntity() { access_token = tokenEntity.access_token }); //獲取 UserInfo _ = QQ.OpenId_Get_User_Info(new QQ_OpenAPI_RequestEntity() { access_token = tokenEntity.access_token, openid = openidEntity.openid }); //身份惟一標識 OpenId = openidEntity.openid; } break; case LoginBase.LoginType.WeiBo: { //獲取 access_token var tokenEntity = Weibo.AccessToken(new Weibo_AccessToken_RequestEntity() { code = authorizeResult.code }); //獲取 access_token 的受權信息 var tokenInfoEntity = Weibo.GetTokenInfo(new Weibo_GetTokenInfo_RequestEntity() { access_token = tokenEntity.access_token }); //獲取 users/show _ = Weibo.UserShow(new Weibo_UserShow_RequestEntity() { access_token = tokenEntity.access_token, uid = Convert.ToInt64(tokenInfoEntity.uid) }); OpenId = tokenEntity.access_token; } break; case LoginBase.LoginType.WeChat: { //獲取 access_token var tokenEntity = WeChat.AccessToken(new WeChat_AccessToken_RequestEntity() { code = authorizeResult.code }); //獲取 user _ = WeChat.Get_User_Info(new WeChat_OpenAPI_RequestEntity() { access_token = tokenEntity.access_token, openid = tokenEntity.openid }); //身份惟一標識 OpenId = tokenEntity.openid; } break; case LoginBase.LoginType.GitHub: { //獲取 access_token var tokenEntity = GitHub.AccessToken(new GitHub_AccessToken_RequestEntity() { code = authorizeResult.code }); //獲取 user var userEntity = GitHub.User(new GitHub_User_RequestEntity() { access_token = tokenEntity.access_token }); OpenId = userEntity.id.ToString(); } break; case LoginBase.LoginType.TaoBao: { //獲取 access_token var tokenEntity = TaoBao.AccessToken(new TaoBao_AccessToken_RequestEntity() { code = authorizeResult.code }); OpenId = tokenEntity.open_uid; } break; case LoginBase.LoginType.MicroSoft: { //獲取 access_token var tokenEntity = MicroSoft.AccessToken(new MicroSoft_AccessToken_RequestEntity() { code = authorizeResult.code }); //獲取 user var userEntity = MicroSoft.User(new MicroSoft_User_RequestEntity() { access_token = tokenEntity.access_token }); OpenId = userEntity.id.ToString(); } break; case LoginBase.LoginType.DingTalk: { //獲取 user var userEntity = DingTalk.User(new DingTalk_User_RequestEntity(), authorizeResult.code); OpenId = userEntity?.openid; } break; case LoginBase.LoginType.Gitee: { //獲取 access_token var tokenEntity = Gitee.AccessToken(new Gitee_AccessToken_RequestEntity() { code = authorizeResult.code }); //獲取 user var userEntity = Gitee.User(new Gitee_User_RequestEntity() { access_token = tokenEntity.access_token }); OpenId = userEntity.id.ToString(); } break; case LoginBase.LoginType.Google: { //獲取 access_token var tokenEntity = Google.AccessToken(new Google_AccessToken_RequestEntity() { code = authorizeResult.code }); //獲取 user var userEntity = Google.User(new Google_User_RequestEntity() { access_token = tokenEntity.access_token }); OpenId = userEntity.sub; } break; case LoginBase.LoginType.AliPay: { //獲取 access_token var tokenEntity = AliPay.AccessToken(new AliPay_AccessToken_RequestEntity() { code = authorizeResult.auth_code }); //實際上這一步已經獲取到 OpenId,登陸驗證能夠了,獲取我的信息還需調用下面的接口 //tokenEntity.user_id //獲取 user var userEntity = AliPay.User(new AliPay_User_RequestEntity() { auth_token = tokenEntity.access_token }); OpenId = userEntity.user_id; } break; case LoginBase.LoginType.StackOverflow: { //獲取 access_token var tokenEntity = StackOverflow.AccessToken(new StackOverflow_AccessToken_RequestEntity() { code = authorizeResult.code }); //獲取 user var userEntity = StackOverflow.User(new StackOverflow_User_RequestEntity() { access_token = tokenEntity.access_token }); OpenId = userEntity.user_id; } break; } //拿到登陸標識 if (string.IsNullOrWhiteSpace(OpenId)) { //TO DO } } } } } }