我用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)上创建,但是不推荐如此 ...
随机推荐
- POJ2478(欧拉函数)
Farey Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15242 Accepted: 6054 D ...
- 分布式缓存系统 Memcached CAS协议
Memcached在1.2.4版本后新增了CAS(Check and Set)协议,主要用于并发控制:memcached中同一个item同时被多个线程(多个客户端)更改的并发问题.CAS协议最本质的东 ...
- python学习(六) 抽象
6.1 懒惰即美德 斐波那契数列: >>> fabs = [0, 1]>>> for i in range(8): fabs.append(fabs[-1] + f ...
- pandas索引操作
Pandas的索引操作 索引对象Index 1. Series和DataFrame中的索引都是Index对象 示例代码: print(type(ser_obj.index)) print(type(d ...
- 从javascript的循环问题来看待闭包本质
第一次接触这个问题还是在我刚开始学js的时候,当时就是一头雾水,时隔一年多了,突然又想起了这个问题,在这个春气盎然的周末,我就坐下来研究下并把结果和大家分享下: 先看代码:demo.html < ...
- : error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
打开项目----项目属性---配置属性----C/C++ ----预处理器----预处理定义,添加_CRT_SECURE_NO_WARNINGS
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart)
在接触WebService时值得收藏的一篇文章: 在调试Axis1.4访问WebService服务时,出现以下错误: Unable to find required classes (javax.ac ...
- 性能调试工具——oprofile
oprofile利用cpu硬件层面提供的性能计数器(performance counter),通过计数采样,帮助我们从进程.函数.代码层面找出占用cpu的"罪魁祸首". 常用命令 ...
- Mac mysql-忘记数据库密码
第一步: 关闭mysql服务:苹果->系统偏好设置最下边点mysql 在弹出页面中关闭mysql服务(点击stop mysql server) 第二步: 进入终端输入:cd /usr/local ...
- 前端html数组去重的方法
数组去重 用到的知识点: 1:indexOf() 该方法是返回数组中元素第一次出现的索引值: 如果有,则正常返回索引值: 如果检索的内容不存在于数组中,则返回-1 2:for循环 练习:数组去重 // ...
