网站接入qq登录
网站接入qq登录可以省去注册账号,增加网站的体验度。那么要实现我自己搭建的站点天天博客的qq单点登录需要以下几个步骤:
1,申请appid和appkey
首先要去https://connect.qq.com/去申请一个网站的qq接入,申请成功时会给一个appid和appkey,前提是要有一个站点。
2,qq登录跳转
申请成功后,开始进行qq登录开发,根据官方文档,需要在放置一个qq登录的图标,然后点击这个图标跳转qq认证登录页。
如下图:

点击登录之后会跳转到相应的页面如下:要确保你的回调页面和申请里面写的一样并且要将url进行URLEncode
当qq登录成功后悔跳转到回调页面,并且会在url里面带上上Authorization Code的值。
3,获取AccessToken
通过Authorization Code获取Access Token,我选择通过后端代码调用,因为前段会出现跨域问题,以下是我的封装的方法
/// <summary>
/// 获取AccessToken
/// </summary>
/// <param name="authorizationCode"></param>
/// <returns></returns>
public static async Task<string> GetAccessToken(string authorizationCode)
{
if (string.IsNullOrEmpty(authorizationCode))
throw new AuthException("qq认证登录失败:authorizationCode为空");
string url = string.Format("https://graph.qq.com/oauth2.0/token?" +
"grant_type=authorization_code&client_id={0}&client_secret={1}&code={2}&redirect_uri={3}&fmt=json", appId, appKey, authorizationCode, redirectUrl);
HttpClient httpClient = new HttpClient();
string response = await httpClient.GetStringAsync(url);
dynamic result = JsonHelper.DeserializeObject(response);
string error = result.error;
if (!string.IsNullOrEmpty(error))
throw new AuthException("qq认证登录失败:" + result.error_description);
return result.access_token; }
4,获取openid
通过token获取openid,其中openid就想当与一个qq号码,唯一的:
/// <summary>
/// 获取OpenId
/// </summary>
/// <param name="authorizationCode"></param>
/// <returns></returns>
public static async Task<string> GetOpenId(string accessToken)
{
if (string.IsNullOrEmpty(accessToken))
throw new AuthException("qq认证登录失败:accessToken无效");
string url = "https://graph.qq.com/oauth2.0/me?fmt=json&access_token=" + accessToken;
HttpClient httpClient = new HttpClient();
string response = await httpClient.GetStringAsync(url);
dynamic result = JsonHelper.DeserializeObject(response);
string error = result.error;
if (!string.IsNullOrEmpty(error))
throw new AuthException("qq认证登录失败:"+result.error_description);
return result.openid; }
5,通过token和openid获取qq信息:
/// <summary>
/// 获取qq信息
/// </summary>
/// <param name="authorizationCode"></param>
/// <returns></returns>
public static async Task<UserModel> GetQQUser(string accessToken,string openId)
{
if (string.IsNullOrEmpty(accessToken))
throw new AuthException("accessToken无效");
if (string.IsNullOrEmpty(openId))
throw new AuthException("openId");
string url = string.Format("https://graph.qq.com/user/get_user_info" +
"?access_token={0}&openid={1}&appid={2}&fmt=json", accessToken, openId, appId);
HttpClient httpClient = new HttpClient();
string response = await httpClient.GetStringAsync(url);
dynamic result = JsonHelper.DeserializeObject(response);
if (result.ret != 0)
throw new AuthException("qq认证登录失败:" + result.msg);
UserModel userModel = new UserModel();
userModel.Account = openId;
userModel.Username = result.nickname;
userModel.LoginType = Blog.Domain.Core.LoginType.QQ;
userModel.Sex = result.gender;
userModel.HeadPhoto = result.figureurl_qq_2;
return userModel; }
6,处理qq信息
到此,qq账号的信息以及获取完成了,接下来就是根据自己的业务来处理qq账号信息了,我选择将qq信息存入user表,后端将qq信息转为对应的user,放入jwt里面生成token:
[Route("login/{code}")]
[HttpGet]
public async Task<ApiResult> Login(string code)
{
string accessToken =await QQClient.GetAccessToken(code);
string openId = await QQClient.GetOpenId(accessToken);
UserModel userModel = await QQClient.GetQQUser(accessToken, openId);
_userService.Insert(userModel);
IList<Claim> claims = new List<Claim>()
{
new Claim("account", userModel.Account),
new Claim("username", userModel.Username),
new Claim("sex", userModel.Sex),
new Claim("birthDate",string.IsNullOrEmpty(userModel.BirthDate)?"":userModel.BirthDate),
new Claim("email", string.IsNullOrEmpty(userModel.Email)?"":userModel.Email),
new Claim("sign", string.IsNullOrEmpty(userModel.Sign)?"":userModel.Sign),
new Claim("phone",string.IsNullOrEmpty(userModel.Phone)?"":userModel.Phone),
new Claim("headPhoto", string.IsNullOrEmpty(userModel.HeadPhoto)?"":userModel.HeadPhoto)
};
string jwtToken = new JWT(_cacheClient).CreateToken(claims);
return ApiResult.Success(jwtToken);
}
7,前端存储token
qq登录后根据你申请里面写的回调页面,qq会自动跳转到这个页面,我的回调页面就一个空白页面,加上一个loading提示,加载这个页面时,调用后端api,进行认证操作,成功后,存入token并且跳转到网站首页:

<!DOCTYPE html>
<html> <head>
<meta name="viewport" content="width = device-width" />
<title>qq认证登录中...</title>
<link rel="icon" href="/style/images/title.png">
</head> <body>
<div>
qq认证登录中...
</div>
<script src="/style/js/jquery.js"></script>
<script src="/style/layui/layui.js"></script>
<script src="/style//js/request.js?v=20112171144"></script>
<script src="/style/js/util.js?v=202009091015"></script>
<script>
layui.use(["layer"], function () {
var layer = layui.layer;
var loading = layer.load(2,{offset: ['100px', '720px']});
var code = getSearchString('code');
if(code==undefined){
layer.msg('code无效', { icon: 5 });
return;
}
$.ajax({
url: url + 'qq/login/' + code,
type: 'get',
dataType: 'json',
success: function (res) {
if (res.code == "200") {
localStorage.setItem("token", res.data);
window.location.href = "../home/index.html";
}
else {
layer.close(loading)
layer.msg(res.message, { icon: 5 });
}
}
})
})
</script>
</body> </html>
通过以上操作,我的个人站点:http://www.ttblog.site已经是完成了qq接入的功能,这只是我自己摸索出来的实现方式,给以参考,设计之中难免有不合理之处,希望有人能给出建议。
网站接入qq登录的更多相关文章
- 网站接入QQ登录的两种方法
第一种使用系统自带按钮登录,但是这样会弹出新窗口,不喜欢 //调用QC.Login方法,指定btnId参数将按钮绑定在容器节点中 QC.Login({ //btnId:插入按钮的节点id,必选 btn ...
- asp.net网站接入QQ登录
这两天在做网站第三方登录,总结一下QQ登录吧,支付宝就不用了(下载dome把ID什么的换一换就基本可以了.),本文主要说的是代码的实现方式,逻辑部分主要还是根据帮助文档来的.不懂的同学可以先看看文档. ...
- 我用Django搭网站(2)-QQ登录
接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权. 第一步:准备阶段 打开QQ互联,并登录你的QQ账号.再点击导航上的" ...
- 网站集成QQ登录功能
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- 网站集成QQ登录功能(转)
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- 站点接入QQ登录
首先引入授权js文件 <script type="text/javascript" src="http://qzonestyle.gtimg.cn/qzone/op ...
- 移动 App 接入 QQ 登录/分享 图文教程
移动 App 接入 QQ 登录/分享 图文教程 这里先要提两个平台,腾讯开放平台和 QQ 互联平台: (一)腾讯开放平台 官网地址:https://open.tencent.com/ 介绍:腾讯开放平 ...
- 网站使用QQ登录问题小结
关于网站如何使用QQ登陆这个问题就不多说了,很简单,登陆connect.qq.com找到相应的SDK,下载下来,里面会有demo,将相应的appid,appkey和回调地址callback改成自己的就 ...
- 接入qq登录功能出现的问题
在调用qq授权的接口时,出现以上错误. 原因是: 打包的应用签名和第一次上传包的签名不一致造成的 解决方法: 第一种方法:用上次打包apk的keystore重新打包apk,使签名一致. 第二种方法:联 ...
- pc版qq登录及移动版qq登录的申请过程
1.在哪里接入? 网站接入QQ登录在QQ互联(https://connect.qq.com)上创建:移动应用也可以在QQ互联(https://connect.qq.com)上创建,但是不推荐如此 ...
随机推荐
- webdav协议及我的笔记方案(私有部署)
背景 用markdown用于文章写作,有几年时间了,不是很喜欢折腾,主要就是在电脑上写,用的笔记软件就是typora.由于里面有很多工作相关的,以及个人资料相关的(包含了各种账号.密码啥的),所以不敢 ...
- Ubuntu下的NVIDIA显卡【驱动&CUDA 安装与卸载】
碎碎念:主要是把显卡相关的整合出来,基础知识后面再放上来 显卡安装后可以有效降低电脑开太多界面卡顿hhh现象,不过如果显卡不好的话或者是独显的话 问题也不大,主要是学习 learning 使用 参考资 ...
- python3 webssh
简介 webssh 是 一个简单的 Web 应用程序,用作 ssh 客户端来连接到 ssh 服务器.它是用Python编写的,基于tornado.paramiko和xterm.js.下面简单搭建一个网 ...
- Python获得操作日志的最后几行记录
该方法一般用于获得操作日志的最后几行记录 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 f = open('seek.txt', 'rb') 4 ...
- 4 - 【RocketMQ 系列】CentOS 7.6 安装部署RocketMQ
五.自启动脚本 1.rocketmq 服务脚本 cd /etc/init.d vim rocketmq 把下面内容填好后 按ESC 再输入 :wq! 保存退出 之后再修改权限 chmod 777 ro ...
- Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向和转发,以及访问静态资源
1. Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向和转发,以及访问静态资源 @ 目录 1. Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向 ...
- [oeasy]python0 113_字符编码_VT100控制码_iso_8859_1_拉丁字符_latin
拉丁字符 回忆上次内容 上次回顾了字型编码的进化过程 7-bit 的 点阵字库 终于让 字母.数字.标点 明确了字型 但是 7-bit 的 ascii中 没有法文字符的位置 添加图 ...
- AT_abc215_d 题解
洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定 \(N\),\(M\) 及含有 \(N\) 个整数的序列 \(A\). 求 \( ...
- Windows/Linux 安装NVM及npm配置
nvm安装及npm配置 nvm nvm下载 Windows: Releases · coreybutler/nvm-windows (github.com) Windows直接下载相应版本的nvm-s ...
- 常用ffmpeg命令集合(收藏吧,帮你省一个录屏软件的会员费)
录制屏幕: 全屏的话用screen-capture-recoder下载地址:https://github.com/rdp/screen-capture-recorder-to-video-window ...