网站集成QQ登录功能

news/2024/5/20 22:48:05/文章来源:https://blog.csdn.net/weixin_34107739/article/details/90283238
原文:网站集成QQ登录功能

最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一下,希望对有这方面需求的朋友有所帮助。

一.前期准备

首先你需要登录QQ的开发平台注册一个账号,QQ互联平台官方地址:http://connect.qq.com/ 进去后注册一个开发账号,完了登录后台会有类似如下的一个后台,填好相关信息,具体可以参考下图。最后我们会有一个APP ID和APP KEY ,有了这两个东西才能实现后面的集成QQ登录功能。


二.开发工作

当我们的账号审核后,QQ开发平台会给我们一个APP ID和APP KEY,有了这两个,我们就可以进行开发的工作了。
QQ的登录采用的是OAuth2.0协议,OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。具体的内容可以参考QQ的API文档http://wiki.connect.qq.com/oauth2-0%e7%ae%80%e4%bb%8b
QQ的开发平台已经有PHP,JAVA,JS等版本的SDK了,如果是要用到这些语言进行开发的可以直接参考这些SDK,我这边直接讲一下ASP.NET版本(MVC)的开发。

第一步.先在WebConfig中的 <appSettings>节点下加入如下配置

<add key="QQAppID" value="QQ平台给的APP ID" />
<add key="QQAppKey" value="QQ开发平台给的APP KEY"/>
<add key="QQCallBack" value="http://www.mylanqiu.com/Account/QQConnect/"/>
<add key="QQAuthorizeURL" value="https://graph.qq.com/oauth2.0/authorize" />

第二步.在Controllers中加一个登陆的Action(我这边用的是MVC的开发方式,如果是传统.NET的可以直接在.aspx的Page_Load事件里加如下方法)

public ActionResult LoginQQ()
{
string state = new Random(100000).Next(99, 99999).ToString();//随机数
Session["QQState"] = state;
string appID = ConfigurationManager.AppSettings["QQAppID"];
string qqAuthorizeURL = ConfigurationManager.AppSettings["QQAuthorizeURL"];
string callback = ConfigurationManager.AppSettings["QQCallBack"];
string authenticationUrl = string.Format("{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}", qqAuthorizeURL, appID, callback, state);//互联地址
return new RedirectResult(authenticationUrl);
}

这一步主要是实现去QQ平台进行身份验证,直观点也就是点击后会去出现如下截图的画面


第三步.在点击了上图的同意登录后(也就是已经使用QQ号在QQ平台登录),QQ平台会通过我们上面配置的回调地址也就是我这边填的http://www.mylanqiu.com/Account/WeiboConnect/返回到这个页面,并会返回一个code给我们,我们到时会使用这个code再去QQ开发平台获取access_token,并通过这个access_token获取登录的相关用户信息。具体代码如下:

/// <summary> 
/// QQ回调页面 
/// </summary>
public ActionResult QQConnect()
{
if (!string.IsNullOrEmpty(Request.Params["code"]) && !string.IsNullOrEmpty(Request.Params["state"]))
{
var code = Request.Params["code"];
var state = Request.Params["state"];
string requestState = Session["QQState"] == null ? "" : Session["QQState"].ToString();
if (state == requestState)
{
try
{
QQOAuthHelper QAuthHelper = new QQOAuthHelper();//这是一个辅助类,代码会在下面给出
QQOauthInfo qqOauthInfo = QAuthHelper.GetOauthInfo(code);
string openID = QAuthHelper.GetOpenID(qqOauthInfo);//获取用的OpenID,这个ID是QQ给我们的用户的唯一ID,可以作为我们系统用户唯一性的判断存在我们自己的库中
Session["QQOpenID"] = openID;
string nickName = QAuthHelper.GetUserInfo(qqOauthInfo, openID);//获取用户的昵称
UserAccount userAccount = AccountBLL.GetUserAccountByOpenID(OAuthPlatform.QQ.ToString(), openID);
if (userAccount != null)//判断是否是已用该OpenID是否已在我们的库中,若已存在则允许登录
{
SetAuthCookie(userAccount);
Response.Write("<script> window.opener.location.reload();window.close();</script>");
}
ViewData["NickName"] = nickName;
}
catch (Exception ex)
{return new RedirectResult("~/Error/Error.htm");
}
}
else
{
return new RedirectResult("~/Error/Error.htm");
}
}
else
{
return new RedirectResult("~/Error/Error.htm");
}
return View();
}

通过上面的步骤就可以实现网站集成QQ登录了。下面给出辅助类的源代码:

using System;
using System.Text;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using System.IO;
namespace Com.ABC.Mylanqiu.BLL
{
public class QQOAuthHelper
{
string appID = ConfigurationManager.AppSettings["QQAppID"];
string appKey = ConfigurationManager.AppSettings["QQAppKey"];
/// <summary>
/// 获取oauth信息
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public QQOauthInfo GetOauthInfo(string code)
{
string callback = System.Web.HttpUtility.UrlEncode(ConfigurationManager.AppSettings["QQCallBack"], Encoding.UTF8);
string url = string.Format("https://graph.qq.com/oauth2.0/token?grant_type={0}&client_id={1}&client_secret={2}&code={3}&redirect_uri={4}", "authorization_code", appID, appKey, code, callback);
string res = LoadHtmlUserGetType(url, Encoding.UTF8);
QQOauthInfo qqOauthInfo = new QQOauthInfo();
qqOauthInfo.AccessToken = CutString(res, "access_token=", "&expires_in=");
qqOauthInfo.ExpiresIn = CutString(res, "&expires_in=", "&refresh_token=");
qqOauthInfo.RefreshToken = res.Split(new string[] { "&refresh_token=" }, StringSplitOptions.None)[1];
return qqOauthInfo;
}
/// <summary>
/// 截取字符串中两个字符串中的字符串
/// </summary>
/// <param name="str">字符串</param>
/// <param name="startStr">开始字符串</param>
/// <param name="endStr">结束字符串</param>
/// <returns></returns>
private string CutString(string str, string startStr, string endStr)
{
int begin, end;
begin = str.IndexOf(startStr, 0) + startStr.Length; //开始位置 
end = str.IndexOf(endStr, begin); //结束位置 
return str.Substring(begin, end - begin); //取搜索的条数,用结束的位置-开始的位置,并返回 
}
/// <summary> 
/// 通过GET方式获取页面的方法 
/// </summary> 
/// <param name="urlString">请求的URL</param> 
/// <param name="encoding">页面编码</param> 
/// <returns></returns> 
public string LoadHtmlUserGetType(string urlString, Encoding encoding)
{HttpWebRequest httpWebRequest = null;
HttpWebResponse httpWebRespones = null;
Stream stream = null;
string htmlString = string.Empty;
try
{
httpWebRequest = WebRequest.Create(urlString) as HttpWebRequest;
}
catch (Exception ex)
{
throw new Exception("建立页面请求时发生错误!", ex);
}
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; Maxthon 2.0)";
try
{
httpWebRespones = (HttpWebResponse)httpWebRequest.GetResponse();
stream = httpWebRespones.GetResponseStream();
}
catch (Exception ex)
{
throw new Exception("接受服务器返回页面时发生错误!", ex);
}
StreamReader streamReader = new StreamReader(stream, encoding);
try
{
htmlString = streamReader.ReadToEnd();
}
catch (Exception ex)
{
throw new Exception("读取页面数据时发生错误!", ex);
}
streamReader.Close();
stream.Close();
return htmlString;
}
/// <summary>
/// 获取QQ账号的OpenID
/// </summary>
/// <param name="qqOauthInfo"></param>
/// <returns></returns>
public string GetOpenID(QQOauthInfo qqOauthInfo)
{
string res = LoadHtmlUserGetType("https://graph.qq.com/oauth2.0/me?access_token=" + qqOauthInfo.AccessToken, Encoding.UTF8);
return CutString(res, @"openid"":""", @"""}");
}
/// <summary>
/// 获取QQ昵称
/// </summary>
/// <param name="qqOauthInfo"></param>
/// <param name="openID"></param>
/// <returns></returns>
public string GetUserInfo(QQOauthInfo qqOauthInfo, string openID)
{string urlGetInfo = string.Format(@"https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}", qqOauthInfo.AccessToken,appID, openID);
string resUserInfo = LoadHtmlUserGetType(urlGetInfo, Encoding.UTF8);
return CutString(resUserInfo, @"""nickname"": """, @""",");
}
}
public class QQOauthInfo
{
public string AccessToken { get; set; }
public string ExpiresIn { get; set; }
public string RefreshToken { get; set; }
}
}

四.Demo效果

大家可以直接访问http://www.mylanqiu.com看一下实际的效果,最后感谢大家的阅读,如对你有所帮助就多多转发,以帮助更多人,正所谓:赠人玫瑰 手有余香!如有不足,还请指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_728114.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你好,我们在自己的服务器上做好了一个网站运行很正常,用FTP工具传到万网的云虚拟主机上后台文本里的内容无法添加怎么回事...

你好&#xff0c;我们在自己的服务器上做好了一个网站后台文本类可以添加运行很正常&#xff0c;用FTP工具传到万网的云虚拟主机上后台文本里的内容无法添加怎么回事

大型网站架构之JAVA中间件

中间件就是在大型网站中&#xff0c;帮助各子模块间实现互相访问&#xff0c;消息共享或统一访问等功能的软件产品。常见的有&#xff1a; 远程服务框架中间件&#xff1a;主要解决各子模块之间互相访问的问题。 消息队列中间件&#xff1a;主要解决各子模之间消息共享的问题。…

印度软件开发人员_印度独角兽网站开发人员访谈

印度软件开发人员与印度最大的金融科技公司之一的开发人员进行的信息丰富的问答环节。 最近&#xff0c;我有机会采访了该国最大的初创公司之一的开发人员Abhinav Pandey 。 Abhinav喜欢整天编写Node.js API和数据库争执。 阅读这篇文章&#xff0c;以找到他对那些希望与年轻的…

印度独角兽网站开发人员访谈

与印度最大的金融科技公司之一的开发人员进行的信息丰富的问答环节。 最近&#xff0c;我有机会采访了该国最大的创业公司之一的开发人员Abhinav Pandey 。 Abhinav喜欢整天编写Node.js API并与数据库纠缠。 阅读本文&#xff0c;以找到他对那些希望磨练自己的技能并在大公司工…

编程爱好者网站_6个爱好编程者可以参与以促进放松

编程爱好者网站Pexels.com 编程可能会令人兴奋&#xff0c;也可能会带来压力。 作为程序员&#xff0c;您在计算机前花费了大量时间。 为了减轻压力和放松&#xff0c;您可以参加以下六个爱好&#xff0c;这将有助于您放松。 1.上音乐课 学习演奏乐器既轻松又有益。 这将有助…

在Google Cloud Storage上托管免费的静态网站

本指南将引导您设置免费存储桶&#xff0c;以使用Google Cloud Platform服务通过自定义域名为静态网站提供服务。 登录到Google Cloud Platform&#xff0c;导航到Cloud DNS服务并创建一个新的公共DNS区域&#xff1a; 默认情况下&#xff0c;它将具有一个NS &#xff08;名称服…

php zblog 侧边栏样式_wordpress网站模板开发中,怎样给侧边栏,添加热门标签?...

使用过wordpress网站的朋友都知道&#xff0c;wordpress的tag标签是非常受欢迎的&#xff0c;尤其受到百度这样的搜索引擎的青睐。我就记得&#xff0c;我第一个wordpress网站&#xff0c;新发表的文章还没有被百度收录&#xff0c;而这篇文章的tag标签却被收录&#xff0c;而且…

深度学习去燥学习编码_5个免费的网站来学习编码

深度学习去燥学习编码最初发布于KnowLab 编码很重要&#xff0c;而且很有趣。 编程是那些追求它的人的礼物。 好吧&#xff0c;编码对于我们的日常生活至关重要。 它提高了解决问题的能力&#xff0c;使您有信心仅用编码语言即可构建所需的任何东西。 这是一份不断奉献的礼物&a…

5个免费的网站来学习编码

最初发布于KnowLab 编码很重要&#xff0c;而且很有趣。 编程是那些追求它的人的礼物。 好吧&#xff0c;编码对于我们的日常生活至关重要。 它提高了解决问题的能力&#xff0c;使您有信心仅用编码语言即可构建任何所需的东西。 这是一份不断奉献的礼物&#xff0c;因为它是在…

Discuz3.0网站安装

1、LAMP环境安装1.1. yum环境配制ok&#xff1b;yum install gcchttp://wangfx.blog.51cto.com/1697877/18718971.2. 代理上网配制OK&#xff1b;http://wangfx.blog.51cto.com/1697877/19021971.3. 执行 ./phpstudy.bin2、Discuz安装2.1. 解压unzip Discuz_X3.0_SC_UTF8.zip…

《妙手回春:网站可用性测试及优化指南(修订版)》一第1章 您看到周围有大象吗?...

本节书摘来自异步社区《妙手回春:网站可用性测试及优化指南&#xff08;修订版&#xff09;》一书中的第1章&#xff0c;第1.1节&#xff0c;作者 【美】Steve Krug&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 第1章 您看到周围有大象吗&#xff1f; 妙手…

mysql网站如何搭建_如何搭建一个自己的网站(绝对详细~)

前言这篇文章教大家如何搭建一个自己的网站&#xff0c;平时我们在写项目的时候大部分都是由运维去部署发布的&#xff0c;可能对这方面不太关注。今天手把手教大家实现&#xff0c;我媳妇看了都学会了&#xff01;准备工具一个可运行的java项目&#xff1b;一台服务器&#xf…

免费网站学习编程_21个免费学习编程的网站

免费网站学习编程精选的网站列表&#xff0c;供您学习编码&#xff0c;编程&#xff0c;Java&#xff0c;Python&#xff0c;SQL&#xff0c;Git和Ruby on Rails。 您好&#xff0c;如果您是自己学习编程和编码并寻找一些很棒的资源的人&#xff0c;那么您来对地方了。 在本文…

21个免费学习编程的网站

精选的网站列表&#xff0c;用于学习编码&#xff0c;编程&#xff0c;Java&#xff0c;Python&#xff0c;SQL&#xff0c;Git和Ruby on Rails。 您好&#xff0c;如果您是一个自己学习编程和编码并寻找一些很棒资源的人&#xff0c;那么您来对地方了。 在本文中&#xff0c;我…

DVWA网站的搭建

DVWA网站的搭建 Damn Vulnerable Web Application (DVWA)&#xff0c;这个应用程序有若干基于web的漏洞&#xff0c;比如跨站脚本 (XSS), SQL注入, CSRF,命令注入等。 首先要配置DVWA有两种方式&#xff0c;一个是手动(需安装Apache,Mysql等服务)&#xff0c;另一个是直接安装…

javascript初学者_10个网站为初学者学习JavaScript

javascript初学者10个深入学习JavaScript的网站 Paul Esch-Laurent在Unsplash上拍摄的照片 大家好&#xff0c;我们很幸运能生活在一个技术世界中&#xff0c;在这里&#xff0c;由于互联网&#xff0c;您可以使用很多资源来学习我们想要的任何东西。 您可以从字面上学到想要的…

10个网站为初学者学习JavaScript

10个深入学习JavaScript的网站 Paul Esch-Laurent在Unsplash上的照片 大家好&#xff0c;我们很幸运能生活在一个技术世界中&#xff0c;在这里&#xff0c;您可以使用很多资源来学习我们想要的任何东西&#xff0c;这一切都要归功于Internet。 您可以从字面上学到您想要的任何…

如何在2019年建立网站

您是否想从头开始构建网站&#xff0c;但不知道从哪里开始&#xff1f; 在从事网络开发人员的职业生涯中&#xff0c;我为百加得&#xff0c;丰田和四个季节等客户建立了100多个网站。 有一次&#xff0c;我什至为弗吉尼亚州的一只半知名山羊制作了一个网站。 在这篇文章中&…

静态表单提交到php数据库_如何将联系表单添加到静态网站

静态表单提交到php数据库该帖子最初发布在 Codementor上 。 随着静态网站的兴起&#xff0c;开发人员需要一种可以处理表单的服务。 静态网站联系表单是最常见的情况&#xff0c;在本文中&#xff0c;您将学习如何使用Kwes form builder添加表单 。 将联系表单添加到静态站点…

如何将联系表单添加到静态网站

这篇文章最初发表在 Codementor上 。 随着静态网站的兴起&#xff0c;开发人员需要一种可以处理表单的服务。 静态网站联系表单是最常见的情况&#xff0c;在本文中&#xff0c;您将学习如何使用Kwes form builder添加表单 。 将联系表单添加到静态站点可能是一个挑战&#xff…