我用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)上创建,但是不推荐如此 ...
随机推荐
- PL/SQL 训练08--触发器
--什么是触发器呢?--一触即发,某个事件发生时,执行的程序块?--数据库触发器是一个当数据库发生某种事件时作为对这个事件的响应而执行的一个被命名的程序单元 --适合场景--对表的修改做验证--数据库 ...
- Linux的启动级别
一.启动级别 1.查看linux 系统默认启动级别cat /etc/inittab id:3:initdefault: ##可以看出默认为三 2.查看某一服务在各个启动级别上是否启动[root@loc ...
- java NIO(转载)
(原文地址:https://zhuanlan.zhihu.com/p/23488863) NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型 ...
- JavaScript笔记——DOM的操作
节点及其类型 在JavaScript中,节点分为三种: 元素节点:HTML标签元素. 属性节点: 元素的属性, 可以直接通过属性的方式来操作. 文本节点: 是元素节点的子节点, 其内容为文本. 在什么 ...
- TIMEQUEST学习之黑金动力(三)
不知不觉,学到的第四章.但是对于TQ的内部模型和外部模型的完整分析还是没有很好的理解.接着学习......... 我们也了解静态时序分析的第一步骤,亦即时钟方面的约束.此外,也稍微对 Report T ...
- python----python使用mysql
Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymql pymsql是Python中操作MySQL的模块,在windows中的安装: pip ...
- Java面向对象作业-用接口方式测试向下转型
Java面向对象作业-用接口方式测试向下转型 根据视频的里实例 我们直接修改Test2测试方法: package com.java1234.chap03.sec13; public class Tes ...
- Oracle11gR2--克隆安装数据库软件
1. 删除oracle之前的产品信息 环境是前篇中通过静默方式安装的,这里只删除产品信息,假设ORACLE_HOME目录是从其他地方拷贝过来的 [oracle@localhost ContentsXM ...
- elastic(9)映射
转自:https://www.cnblogs.com/eryuan/p/7389728.html?utm_source=debugrun&utm_medium=referral elastic ...
- oracle语言基础
一.语言分类 1.DML(Data Manipulation Language,数据操作语言):用于对数据的操作. DML包括:(1)SELECT:查询数据 select * from temp; ...
