.net core 实现QQ登陆网站

1 public const string appId = "";//QQ的APPID 2 public const string appSecret = "";//QQ的appSecret 3 public const string redirecturl = "";//回调地址 4 5 #region QQ登陆 6 /// <summary> 7 /// 打开qq授权页面 8 /// </summary> 9 /// <returns></returns> 10 public virtual IActionResult QqAuthorize() 11 { 12 var url=string.Format( 13 "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id={0}&redirect_uri={1}&state=State", 14 appId, WebUtility.UrlEncode(redirecturl)); 15 return new RedirectResult(url); 16 } 17 /// <summary> 18 /// QQ回掉方法 19 /// </summary> 20 /// <returns></returns> 21 public virtual IActionResult QQLogin() 22 { 23 var code = Request.Query["code"]; 24 var token = GetAuthorityAccessToken(code); 25 var dis = GetAuthorityOpendIdAndUnionId(token); 26 var userInfo = GetUserInfo(token, dis["openid"]); 27 return null; 28 } 29 30 31 public virtual string GetAuthorityAccessToken(string code) 32 { 33 if (string.IsNullOrEmpty(code)) 34 return null; 35 var url = 36 string.Format( 37 "https://graph.qq.com/oauth2.0/token?client_id={0}&client_secret={1}&code={2}&grant_type=authorization_code&redirect_uri={3}", 38 appId, appSecret, code, redirecturl); 39 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 40 var json =WebRequestHelper.GetResponse(request, "utf-8"); 41 if (string.IsNullOrEmpty(json)) 42 return null; 43 if (!json.Contains("access_token")) 44 { 45 return null; 46 } 47 var dis = json.Split('&').Where(it => it.Contains("access_token")).FirstOrDefault(); 48 var accessToken = dis.Split('=')[1]; 49 return accessToken; 50 } 51 /// <summary> 52 /// 获取OpenId和UnionId 53 /// </summary> 54 /// <param name="token"></param> 55 /// <returns></returns> 56 public virtual Dictionary<string, string> GetAuthorityOpendIdAndUnionId(string token) 57 { 58 if (string.IsNullOrEmpty(token)) return null; 59 var url = $"https://graph.qq.com/oauth2.0/me?access_token={token}&unionid=1"; 60 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 61 request.Method = "GET"; 62 request.ContentType = "application/x-www-form-urlencoded"; 63 var json =WebRequestHelper.GetResponse(request, "utf-8"); 64 if (string.IsNullOrEmpty(json) || json.Contains("error") || !json.Contains("callback")) 65 return null; 66 Regex reg = new Regex(@"\(([^)]*)\)"); 67 Match m = reg.Match(json); 68 var dis = m.Result("$1").DeserializeJson<Dictionary<string, string>>(); 69 return dis; 70 } 71 /// <summary> 72 /// 获取用户的基本信息 73 /// </summary> 74 /// <param name="token"></param> 75 /// <param name="openId"></param> 76 /// <returns></returns> 77 public virtual Dictionary<string, string> GetUserInfo(string token, string openId) 78 { 79 if (string.IsNullOrEmpty(token)) return null; 80 var url = $"https://graph.qq.com/user/get_user_info?access_token={token}&openid={openId}&oauth_consumer_key={appId}"; 81 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 82 var json =WebRequestHelper.GetResponse(request, "utf-8"); 83 var dis = json.DeserializeJson<Dictionary<string, string>>(); 84 if (dis.ContainsKey("ret") && dis["ret"] != "0") 85 return null; 86 return dis; 87 } 88 #endregion
//PS.
我的项目中不允许用户直接使用第三方登陆,所在在登陆的时候会给一个页面让用户绑定已有账号
在项目中遇到一个前端的知识盲区,就是如何关闭页面的同时刷新登陆页面。
用到的js很简单
1 需关闭的页面 2 document.domain='@Html.GetUrl("Domain")';//跨域 3 var json = { 4 Status:@Model.IsLogin.ToString().ToLower(), 5 } 6 window.opener.callbackQq(json) 7 window.close(); 8 需刷新的页面 9 window.callbackQq = function (result) { 10 if (result.Status) { 11 window.location.reload(); 12 } 13 else { 14 var _html = ""; 15 _html += '<span class="failure">请绑定账号,再使用第三方登陆</span>'; 16 $("#error").append(_html); 17 } 18 }
登陆到这里应该算是完结了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步