新浪微博第三方登錄使用的是OAuth2.0诲祸,開發(fā)前提已經注冊開發(fā)者帳號封断,是開發(fā)者。
OAuth簡介
OAuth: OAuth(開放授權)是一個開放標準爹脾,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息帖旨,而不需要將用戶名和密碼提供給第三方網站或分享他們數(shù)據(jù)的所有內容箕昭。
具體開發(fā)步驟
第一步:準備階段
打開微博開發(fā)平臺,并登錄你的新浪微博賬號解阅。再點擊導航上的“微鏈接”--> “網站接入”落竹。
網站接入
立即接入
創(chuàng)建應用
創(chuàng)建完應用后再基本信息里就可以拿到App Key和App Secret。在開發(fā)階段可以直接拿來使用货抄,如果網站上線需要完善等級信息述召。
App Key和App Secret
填寫授權回調地址
微博第三方登錄的大體步驟:先跳轉到用戶登錄界面,同意后回調到填寫的回調頁面蟹地,獲得code碼积暖,通過code碼獲取access_token,其中包含用戶的唯一表示uid怪与。
第二步:具體開發(fā)
登錄界面
- 創(chuàng)建web應用
創(chuàng)建完成之后夺刑,打開models.py文件,編寫模型:
class Users(models.Model):
uid = models.CharField(max_length=64, null=True) # 微博的關聯(lián)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是否存在數(shù)據(jù)庫中刽脖。若存在羞海,則直接登錄對應的用戶即可;若不存在曲管,則獲取調取獲取用戶信息的新浪接口却邓,獲取用戶信息。
- 開發(fā)登錄模塊
1.在工程目錄settings.py中設置常量
'''微博登錄常量'''
WEIBO_APP_ID = "App Key"
WEIBO_APP_KEY = "App Secret"
WEIBO_REDIRECT_URI = "回調地址"
2.在對應應用的文件夾下創(chuàng)建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
注:獲取郵箱地址的接口是屬于高級權限撬腾,需要先通過審核,然后在我的應用中的接口管理中申請恢恼。新浪提供的API測試頁面民傻。