1. 程式人生 > >Django 專案總結(3)- 第三方登入(QQ登入)

Django 專案總結(3)- 第三方登入(QQ登入)

第三方登入(QQ 登入)

根據 qq 開發文件 oauth2.0

QQ 登入流程:

  1. 前端頁面點選 QQ 登入,需要跳轉到 QQ 的登入頁面,但是前端不知道 QQ 的登入連結,所以先想後端傳送請求,由伺服器生成 QQ 登入頁地址,返回給前端;
  2. 使用者在 QQ 登入頁進行登入,QQ 將使用者重定向到伺服器的 callback 網站(當時給定的回撥地址),並攜帶授權 code;
  3. 訪問 callback?code=xx 網址,請求發到後端;
  4. 自己的伺服器憑藉 code 向 QQ 伺服器請求 access_token,返回 access_token 後,憑藉 access_token 向 QQ 伺服器請求 open_id,open_id 是當前登入的 QQ 使用者在 QQ 伺服器的唯一身份標識;
  5. 伺服器拿到 open_id 之後,判斷當前 open_id 是否繫結過;
  6. 如果沒有繫結過,說明是第一次進來,返回一個 access_token,用於繫結操作,前端收到用於繫結的 access_token 就會跳轉到繫結頁面,使用者填寫資料,攜帶手機號、密碼、簡訊驗證碼、access_token 請求繫結 QQ 使用者身份,如果伺服器中存在使用者資料,判斷密碼是否正確,進行繫結,如果不存在,建立使用者並繫結身份,最後再返回登入成功的 JWT token;
  7. 如果繫結過,說明使用者不是第一次 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型別