python flask框架发布问答平台注册页面_Python|Flask框架实现QQ账号登录
本文首發于微信公眾號:"算法與編程之美",歡迎關注,及時了解更多此系列文章。
前期準備
因為注冊QQ互聯需要已備案的網站,所以需要準備一個已備案的網站與域名。
首先訪問QQ互聯平臺https://connect.qq.com/,注冊成為開發者;
然后創建一個網站應用,等審核成功后會得到一個APP ID與APP KEY,后面會使用到。
開發流程
圖1 準備網站應用
1 前端放置登錄按鈕
在網站找一個合適的位置放置登錄按鈕(建議放置在首頁、登錄頁以及注冊頁)。登錄按鈕圖標在QQ互聯平臺下載,上面提供了多種樣式。效果如下:
圖2 登陸頁
具體HTMl代碼如下:
href="https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=YOURAPPID&redirect_uri=URL">
其中a標簽中 client_id 是最開始申請的APPID,redirect_uri是申請網站填寫的網站回調域。
這樣點開QQ登錄按鈕,就能跳轉到QQ登錄的界面:
圖3 轉跳后頁面
2 獲取Access Toke
當登錄成功后,會跳轉到剛剛所填寫的回調地址。并且url后面會跟上Authorization Code(此Code在10分鐘內過期)。接著通過Code值去獲取Access Token(Access Token是應用在調用OpenAPI訪問和修改用戶數據時必須傳入的參數)。
為了獲取Access Token需要請求:
https://graph.qq.com/oauth2.0/token,方式為GET,請求參數包括以下:
參數是否必須含義grant_type必須值為“authorization_code”。
client_id必須申請QQ登錄成功后,分配給網站的appid。
client_secret必須申請QQ登錄成功后,分配給網站的appkey。
code必須上一步返回的authorization code
redirect_uri必須與上面一步中傳入的redirect_uri保持一致。
如果成功返回,就可以得到Access Token。這一步具體代碼如下:@home.route('/mycb')
def mycb():
data = request.args.to_dict()
code = data.get('code') #獲取authorization code
url = 'https://graph.qq.com/oauth2.0/token'
body={'grant_type': 'authorization_code', 'client_id': '101860781','client_secret':'0f5a014e13e7d35fbcca51ecc2ff6745','code':code,'redirect_uri':'https://yujl.top/mycb'}
#body為上面所說的請求參數
response = requests.get(url, params=body) #發送GET請求
token = response.text 得到返回包
token_url = '?' + token
requests.session().close() #關閉請求
return redirect('/token' + token_url)
由于返回回來的包格式為:access_token=61897CE***************D444F968BD2A&expires_in=77**000&refresh_token=0018693**************6009D9C2EFBE
這樣不能直接轉換為json格式,所以將這個包作為參數然后轉發到/token,以此來得到json格式的token。@home.route('/token')
def token():
data = request.args.to_dict() #得到access_token、expires_in、refresh_token
3 通過access_token來獲取open_id
接著需要通過access_token來獲取open_id(openid是此網站上唯一對應用戶身份的標識,網站可將此ID進行存儲便于用戶下次登錄時辨識其身份)。
請求地址為https://graph.qq.com/oauth2.0/me,方法還是GET,參數就是上面獲取到的access_token。具體方法為:def get_openid(data): data為token得到的數據包
url = 'https://graph.qq.com/oauth2.0/me'
body = {'access_token': data.get('access_token')}
response = requests.get(url, params=body)
open_id = json.loads(response.text[10:-4])
open_id = open_id.get('openid')
requests.session().close()
return open_id
4 調用OpenAPI
得到open_id就可以調用OpenAPI了,API列表如下:
圖4 API列表
接下來以get_user_info 為例:
還是以GET方式請求:
https://graph.qq.com/user/get_user_info,
需要的參數有access_token、oauth_consumer_key(APP ID)、openid。代碼示例:def get_user_info(data, open_id):
url = 'https://graph.qq.com/user/get_user_info'
body={'access_token':data.get('access_token'), 'oauth_consumer_key': '101860781', 'openid': open_id}
response = requests.get(url, params=body)
user_info = response.json()
requests.session().close()
return user_info
返回的參數說明:
圖5 參數說明
5 保存用戶數據
到這一步,基本就完成了。接著就是根據自己的需要,可以在user界面展示昵稱和頭像,和選擇存進數據庫了。選擇將open_id作為用戶的唯一標識符存進數據庫,這樣用戶在后面登錄的時候可以得到上次保存的信息。以下是這部分代碼:@home.route('/token')
def token():
data = request.args.to_dict()
open_id = get_openid(data)
user_info = get_user_info(data, open_id)
uuid_count=User.query.filter_by(uuid=open_id).count()
#查詢openid是否存在。
if uuid_count == 1:
#如果存在就根據openid查到用戶信息,并添加到session空間里。
name = User.query.filter_by(uuid=open_id).first()
session['home'] = name.name
return redirect('/user')
else:
#如果不存在,也就是第一次登錄,給一個默認的密碼(經過hash加密)
password = generate_password_hash('123456')
hash_name = str(hash(random.randint(1000,9999)))
name = user_info.get('nickname') + hash_name
#因為我的網站是不允許重名的,所以在qq的昵稱后面加上一個隨機數。
user = User(
name=name, #添加了隨機數的用戶名
uuid=open_id, #唯一標識符
pwd = password, #密碼
face=user_info.get('figureurl_1') #頭像
)#將相關信息存進數據庫
db.session.add(user)
db.session.commit()
session['home'] = name #將用戶名添加到session空間中。
return redirect('/user') # 重定向到user界面。
總結
以上是生活随笔為你收集整理的python flask框架发布问答平台注册页面_Python|Flask框架实现QQ账号登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java try catch_Java中
- 下一篇: do while循环语句_流程控制之循环