我用Django搭网站(2)-QQ登录

接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权。
流程步骤

第一步:准备阶段

打开QQ互联,并登录你的QQ账号。再点击导航上的“应用管理”,创建应用获取appid和appkey。
创建应用
创建应用
其中要注意的是网站名称要和备案的网站名称一致,否则会审核不通过
填写回调地址
创建完应用以后就可以获得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方法获取用户的详细信息。

posted @ 2018-08-13 01:33  PHP大菜鸡  阅读(265)  评论(0编辑  收藏  举报