Django 專案總結(3)- 第三方登入(QQ登入)
阿新 • • 發佈:2018-11-28
第三方登入(QQ 登入)
根據 qq 開發文件 oauth2.0
QQ 登入流程:
- 前端頁面點選 QQ 登入,需要跳轉到 QQ 的登入頁面,但是前端不知道 QQ 的登入連結,所以先想後端傳送請求,由伺服器生成 QQ 登入頁地址,返回給前端;
- 使用者在 QQ 登入頁進行登入,QQ 將使用者重定向到伺服器的 callback 網站(當時給定的回撥地址),並攜帶授權 code;
- 訪問 callback?code=xx 網址,請求發到後端;
- 自己的伺服器憑藉 code 向 QQ 伺服器請求 access_token,返回 access_token 後,憑藉 access_token 向 QQ 伺服器請求 open_id,open_id 是當前登入的 QQ 使用者在 QQ 伺服器的唯一身份標識;
- 伺服器拿到 open_id 之後,判斷當前 open_id 是否繫結過;
- 如果沒有繫結過,說明是第一次進來,返回一個 access_token,用於繫結操作,前端收到用於繫結的 access_token 就會跳轉到繫結頁面,使用者填寫資料,攜帶手機號、密碼、簡訊驗證碼、access_token 請求繫結 QQ 使用者身份,如果伺服器中存在使用者資料,判斷密碼是否正確,進行繫結,如果不存在,建立使用者並繫結身份,最後再返回登入成功的 JWT token;
- 如果繫結過,說明使用者不是第一次 QQ 登入,直接返回登入的 JWT token,不會再跳轉到繫結介面。
urllib使用說明
在後端介面中,我們需要向QQ伺服器傳送請求,查詢使用者的QQ資訊,Python提供了標準模組urllib可以幫助我們傳送http請求。
- urllib.parse.urlencode(query)
將query字典轉換為url路徑中的查詢字串
- urllib.parse.parse_qs(qs)
將qs查詢字串格式資料轉換為python的字典
- urllib.request.urlopen(url, data=None)
傳送http請求,如果data為None,傳送GET請求,如果data不為None,傳送POST請求
返回response響應物件,可以通過read()讀取響應體資料,需要注意讀取出的響應體資料為bytes型別