我用Django搭网站(2)-QQ登录
接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权。
第一步:准备阶段
打开QQ互联,并登录你的QQ账号。再点击导航上的“应用管理”,创建应用获取appid和appkey。


其中要注意的是网站名称要和备案的网站名称一致,否则会审核不通过

创建完应用以后就可以获得appid和appkey了,即使审核没通过也没关系,测试也可以使用。

第二步:具体开发
- 创建web应用
创建完成之后,打开models.py文件,编写模型:
class Users(models.Model):
qq_openid = models.CharField(max_length=64, null=True) # QQ的关联OpenID
description = models.CharField(max_length=200, null=True) # 个性签名
nickname = models.CharField(max_length=30, null=True) # 用户昵称
head = models.CharField(max_length=100, null=True) # 用户头像
sex = models.CharField(max_length=2, null=True) # 性别
模型用于存储QQ登录返回的openid值。这个openid是与QQ互联创建的应用一一对应。
在总的urls路由中,加入对应应用路由。
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('login/', include('login.urls')), # 登录模块
]
打开对应应用目录下urls.py文件,填写对用的路由:
from django.urls import path
from . import views
urlpatterns = [
path('oauth/qq/login', views.qq_login),# qq登录
path('qq/connect/callback.php', views.qq_check), # 回调路由
]
- 开发登录模块
1.在工程目录settings.py中设置常量
'''QQ登录常量'''
QQ_APP_ID = "appid"
QQ_APP_KEY = "appkey"
REDIRECT_URI = "回调地址"
2.在对应应用的文件夹下创建qq_oauth.py文件,编辑qq_oauth.py文件:
import requests
import json
class OAuthQQ:
def __init__(self, client_id, client_key, redirect_uri):
self.client_id = client_id
self.client_key = client_key
self.redirect_uri = redirect_uri
def get_auth_url(self):
"""获取授权页面的网址"""
return 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=' + self.client_id + '&state=1&scope=get_user_info&redirect_uri=' + self.redirect_uri
def get_access_token(self, code):
"""根据code获取access_token"""
url = "https://graph.qq.com/oauth2.0/token"
querystring = {
"grant_type": "authorization_code",
"client_id": self.client_id,
"client_secret": self.client_key,
"code": code,
"redirect_uri": self.redirect_uri
}
response = requests.request("GET", url, params=querystring)
return response.text.split('=', 3)[1].split('&', 1)[0]
def get_openid(self, access_token): # 获取用户的openid
url = "https://graph.qq.com/oauth2.0/me"
querystring = {"access_token": access_token}
response = requests.request("GET", url, params=querystring)
call_back = str(response.text)[9:-3]
return json.loads(call_back)['openid']
def get_user_info(self, access_token, qq_openid): # 获取用户的详细信息
url = "https://graph.qq.com/user/get_user_info"
querystring = {
"access_token": access_token,
"oauth_consumer_key": self.client_id,
"openid": qq_openid
}
response = requests.request("GET", url, params=querystring)
return json.loads(response.text)
3.编辑对应应用的文件夹下views.py文件:
from .qq_oauth import OAuthQQ
def qq_login(request): # QQ第三方登录
# 获取 得到Authorization Code的地址
url = OAuthQQ(settings.QQ_APP_ID,
settings.QQ_APP_KEY,
settings.REDIRECT_URI).get_auth_url()
# 重定向到授权页面
return HttpResponseRedirect(url)
def qq_check(request): # 第三方QQ登录,回调函数
"""登录之后,会跳转到这里。需要判断code和state"""
code = request.GET.get('code', None)
authqq = OAuthQQ(settings.QQ_APP_ID, settings.QQ_APP_KEY, settings.REDIRECT_URI)
access_token = authqq.get_access_token(code) # 获取access_token
time.sleep(0.05) # 稍微停一下,给系统调用接口一点时间
qq_openid = authqq.get_openid(access_token) # 获取用户的openid
if_new_user = models.Users.objects.filter(qq_openid=qq_openid).first() # 通过openid判断是否是新用户
if if_new_user is not None:
#老用户处理逻辑
else:
# 新用户业务处理逻辑
总结:
大体思路是用户点击QQ登录按钮调用qq_login方法然后跳转到登陆授权页面,当用户授权登录之后,QQ会跳转到回调页面,get方式携带code。得到code以后使用get_access_token方法得到access_token。
得到access_token后拿来获取openid。获取到openid之后,通过openid判断是否是新用户,来调取get_user_info方法获取用户的详细信息。
我用Django搭网站(2)-QQ登录的更多相关文章
- 我用Django搭网站(1)-新浪微博登录
新浪微博第三方登录使用的是OAuth2.0,开发前提已经注册开发者帐号,是开发者. OAuth简介 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提 ...
- 网站集成QQ登录功能
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- 网站集成QQ登录功能(转)
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- django项目学习之QQ登录
最近在用django框架写一个商城项目(前后端分离),里面用到的一些技术其他项目也可以借鉴,于是就想写一些博客记录,以防自己忘记,今天先写一个关于登录接口中引入QQ登录接口的流程. 关于QQ登录接口的 ...
- 网站接入QQ登录的两种方法
第一种使用系统自带按钮登录,但是这样会弹出新窗口,不喜欢 //调用QC.Login方法,指定btnId参数将按钮绑定在容器节点中 QC.Login({ //btnId:插入按钮的节点id,必选 btn ...
- asp.net网站接入QQ登录
这两天在做网站第三方登录,总结一下QQ登录吧,支付宝就不用了(下载dome把ID什么的换一换就基本可以了.),本文主要说的是代码的实现方式,逻辑部分主要还是根据帮助文档来的.不懂的同学可以先看看文档. ...
- 网站使用QQ登录问题小结
关于网站如何使用QQ登陆这个问题就不多说了,很简单,登陆connect.qq.com找到相应的SDK,下载下来,里面会有demo,将相应的appid,appkey和回调地址callback改成自己的就 ...
- 我用Django搭网站(3)-表单RSA加密
之前开发项目时因为种种原因一直使用明文提交,表单直接明文提交非常不安全,只要稍加操作就能轻易获取用户的信息.在众里寻他千百度之后决定使用RSA加密方式,简单可靠. 项目准备 一.安装PyCrypto库 ...
- pc版qq登录及移动版qq登录的申请过程
1.在哪里接入? 网站接入QQ登录在QQ互联(https://connect.qq.com)上创建:移动应用也可以在QQ互联(https://connect.qq.com)上创建,但是不推荐如此 ...
随机推荐
- mysql实战优化之三:表优化
对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈.所以,把你的数据变得紧凑会对这种情况非常有帮助,因为这减少了对硬盘的访问. 如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理 ...
- zabbix snmp 协议监控 dell iRDAC
转摘:http://blog.csdn.net/wanglei_storage/article/details/52789921 http://blog.csdn.net/wanglei_storag ...
- XAMPP配置8080端口
IIS需要HTTP服务,这个服务占用了80端口. Apache启动不了,为了都可以使用,将Apache端口改为8080.
- Deep Learning 学习笔记(4):Logistic Regression 逻辑回归
逻辑回归主要用于解决分类问题,在现实中有更多的运用, 正常邮件or垃圾邮件 车or行人 涨价or不涨价 用我们EE的例子就是: 高电平or低电平 同时逻辑回归也是后面神经网络到深度学习的基础. (原来 ...
- leetcode343
public class Solution { public int IntegerBreak(int n) { ) { ; } ) { ; } var max = int.MinValue; ; i ...
- 语法错误 : 缺少“;”(在“*”的前面) 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
sv2010编译的时候遇到错误: error C2143: 语法错误 : 缺少“;”(在“*”的前面) error C4430: 缺少类型说明符 - 假定为 int.注意: C++ 不支持默认 int ...
- 14-EasyNetQ之用Future Publish发布预定中事件
很多商业流程需要事件在未来的时间按照预定时间发布.例如,在初次与客户接触后,可以在未来某个时间去电话回访客户.EasyNetQ可以用它的Future Publish功能帮你实现这个功能.举例:这里我们 ...
- json转字符串 —— jsonObj.toJSONString()与JSON.stringify(jsonObj)
ar people = { "programmers": [{ "firstName": "Brett", "lastName&q ...
- PHP数据结构之一:PHP数据结构基本概念—数据结构
学习任何一种技术都应该先清楚它的基本概念,这是学习任何知识的起点!本文是讲述数据结构的基本概念,适合对数据结构已经有一定基础的程序员,更是适合想要学习数据结构的code一族!让我们开始PHP数据结构的 ...
- easylogging++学习记录(一):接入
easylogging++是一个非常轻量级并且非常高效的一个日志库,支持文件配置,支持线程安全,并且其自定义格式非常的方便,最关键的是,其所有代码都集中在一个.h头文件之中,完全不需要引用第三方库,接 ...
