我用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)上创建,但是不推荐如此 ...
随机推荐
- 1023 Have Fun with Numbers
题意: 给定一个正整数(最多有20位),假设这个数是a1a2a3...ak,把这个数乘以2倍,看得到的结果是否仍然是a1a2a3...ak的一个排列 思路: 大整数与int型整数的乘法:简单哈希 ...
- AJAX验证此ID是否有对应的name
在表格输入一个ID,然后自动根据ID在数据库中查找是否有对应name 这是javascript部分,利用ajax验证 $(document).ready(function() { $("#c ...
- 24 mysql怎么保证主备一致
Mysql主备的基本原理 在状态1中,客户端直接访问节点A,而节点B只是备库,只是将A的binlog全部同步过来并应用到本地,这样可以保持节点B和节点A的数据是相同的. 当需要切换的时候,就变成状态2 ...
- MFC学习(三)程序入口和执行流程
1) WIN32 API程序当中,程序入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序窗口函数.而在MFC程序当中我们 ...
- JAVA的FileOutput/InputStream使用实例
在JAVA中,要读写文件,要使用Stream这个东西. Stream简单来说,可以看做在程序和文件之间打开了一个管道,然后把数据通过这个管道输送到文件或程序中去. FileOutput/InputSt ...
- Sql Server 2005如何导入DBF文件?
提问者采纳 select * into 要生成的SQL表名 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;HDR=NO;IMEX=2;DA ...
- <正则吃饺子> :关于redis集群的搭建、集群测试、搭建中遇到的问题总结
项目中使用了redis ,对于其基本的使用,相对简单些,根据项目中已经提供的工具就可以实现基本的功能,但是只是这样的话,对于redis还是太肤浅,甚至刚开始时候,集群.多节点.主从是什么,他们之间是什 ...
- 微信小程序中在页面中实现下拉刷新显示提醒语后在消失
最近在做小程序的时候遇见一个问题,就是页面要下拉刷新给客户一个提醒语,查看了小程序的官方文档 这里有个注意点:如果你是一页进行下拉刷新就在那个文件夹的json里面加上"enablePullD ...
- MAVEN学习总结1
一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenProject/Maven2EclipsePlugin
- java基础之多线程五:实现Runnable的原理
实现Runnable接口的原理. 背景: 多线程的第一种实现方式是::继承Thread类, 因为我们自定义的类(MyThread)是Thread类的子类, 所以MyThread类的对象调用start( ...
