欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

我用Django搭网站(1)-新浪微博登录

程序员文章站 2023-11-27 15:36:04
新浪微博第三方登录使用的是OAuth2.0,开发前提已经注册开发者帐号,是开发者。 OAuth简介 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。 具体开发步骤 第一步 ......

新浪微博第三方登录使用的是OAuth2.0,开发前提已经注册开发者帐号,是开发者。

OAuth简介

OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。

具体开发步骤

第一步:准备阶段

打开微博,并登录你的新浪微博账号。再点击导航上的“微链接”--> “网站接入”。
我用Django搭网站(1)-新浪微博登录
我用Django搭网站(1)-新浪微博登录
我用Django搭网站(1)-新浪微博登录
创建完应用后再基本信息里就可以拿到App Key和App Secret。在开发阶段可以直接拿来使用,如果网站上线需要完善等级信息。
我用Django搭网站(1)-新浪微博登录
我用Django搭网站(1)-新浪微博登录
微博第三方登录的大体步骤:先跳转到用户登录界面,同意后回调到填写的回调页面,获得code码,通过code码获取access_token,其中包含用户的唯一表示uid。

第一步:具体开发

我用Django搭网站(1)-新浪微博登录

  • 创建web应用
    创建完成之后,打开models.py文件,编写模型:
class Users(models.Model):
    uid = models.CharField(max_length=64, null=True)  # 微博的关联uid
    nickname = models.CharField(max_length=30, null=True)  # 用户昵称
    head = models.CharField(max_length=100, null=True)  # 用户头像
    sex = models.CharField(max_length=2, null=True)  # 性别
    register_time = models.DateTimeField('保存日期')  # 注册时间
    register_ip = models.CharField(max_length=30, null=True)  # 注册ip
    last_time = models.DateTimeField('最后修改日期')  # 最后一次登录时间

模型用于存储微博登录返回的uid值。这个uid是与微博一一对应。
在总的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/weibo/login', views.weibo_login),  # 微博授权页面
    path('weibo/connect/callback.php', views.weibo_get_code),  # 微博回调页面
]

oauth/weibo/login和weibo/connect/callback.php,分别是打开授权页面和回调地址。
大致步骤是授权之后,得到uid。判断这个uid是否存在数据库中。若存在,则直接登录对应的用户即可;若不存在,则获取调取获取用户信息的新浪接口,获取用户信息。

  • 开发登录模块
    1.在工程目录settings.py中设置常量
'''微博登录常量'''
WEIBO_APP_ID = "App Key"
WEIBO_APP_KEY = "App Secret"
WEIBO_REDIRECT_URI = "回调地址"

2.在对应应用的文件夹下创建wb_oauth.py文件,编辑wb_oauth.py文件:

import requests
import json


class OAuthWB:
    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_access_token(self, code):  # 获取用户token和uid
        url = "https://api.weibo.com/oauth2/access_token"

        querystring = {
            "client_id": self.client_id,
            "client_secret": self.client_key,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": self.redirect_uri
        }

        response = requests.request("POST", url, params=querystring)

        return json.loads(response.text)

    def get_user_info(self, access_token_data):
        url = "https://api.weibo.com/2/users/show.json"

        querystring = {
            "uid": access_token_data['uid'],
            "access_token": access_token_data['access_token']
        }

        response = requests.request("GET", url, params=querystring)

        return json.loads(response.text)

3.编辑对应应用的文件夹下views.py文件:

from .wb_oauth import OAuthWB
from django.conf import settings  # 引入常量
def weibo_login(request):# 跳转授权页面
    return HttpResponseRedirect(
        'https://api.weibo.com/oauth2/authorize?client_id=' + settings.WEIBO_APP_ID + '&redirect_uri=' + settings.WEIBO_REDIRECT_URI)


def weibo_get_code(request):
    """登录之后,会跳转到这里。需要判断code和state"""
    code = request.GET.get('code', None)
    sina = OAuthWB(settings.WEIBO_APP_ID,
                   settings.WEIBO_APP_KEY,
                   settings.WEIBO_REDIRECT_URI)
    user_info = sina.get_access_token(code)
    time.sleep(0.1)  # 防止还没请求到token就进行下一步
    # 通过uid查询出是否是新用户,新用户则注册登录
    is_user_exist = models.Users.objects.filter(uid=user_info['uid']).first()
    if is_user_exist is not None:
        # 存在直接登录
        pass
    else:
        #不存在获取用户信息
        new_user_info = sina.get_user_info(user_info)
        users_dict = {
            "uid": new_user_info['id'],
            'description': new_user_info['description'],
            "head": new_user_info['profile_image_url'],
            "nickname": new_user_info['name'],
        }
        users_table_obj = models.Users.objects.create(**users_dict).id   

注:获取邮箱地址的接口是属于高级权限,需要先通过审核,然后在我的应用中的接口管理中申请。新浪提供的。