我目前寫的,是我理解的感覺靠譜一點的方法
假設后端的登錄接口地址在oauth/
下
第一次登錄步驟流程
1、用戶點擊登錄按鈕,前端向oauth/sign-up
地址發送get請求,此時后端將會用qq的服務器地址和訪問參數構造一個訪問,訪問qq的服務器,設定回調地址為前端的“等待”頁面,并將訪問得到的頁面直接傳給前端(注意這里不是傳送json數組)
2、前端向用戶展示后端發來的授權頁面,不同意授權,則停止,在同意授權時,前端獲得來自qq服務器的回調,進入“等待頁面”,其中在回調地址中會接上authorization_code,從而獲得authorization_code。
3、前端通過回調地址中的參數獲得authorization_code后,將其發送給后端的oauth/get-token
接口,后端通過authrization_code繼續訪問qq服務器獲得access_token和refresh_token并且儲存,再通過access_token獲得用戶的用戶名、頭像地址、性別和openId,并將這些作為接口的json返回,最后后端服務器設置cookie(永久)儲存用戶加密過的openId,user_id和獲取access_token的時間(便于刷新access_token),并且讓session儲存user_id,用于檢測用戶的登錄狀態,在這個過程中,前端一直保持等待狀態。
4、前端通過上一步返回的頭像地址獲得用戶頭像,然后退出等待頁面,最后根據user_id對應保存用戶的頭像,性別和用戶名這些信息,如果丟失,應該向接口oauth/user-info
接口重新申請信息。
5、如果cookie丟失,則無法判斷用戶身份,需要重新進行授權。
6、后端同樣需要儲存user_name,user_image_address,user_sex。
關閉瀏覽器后重新自動登錄
關閉瀏覽器之后,session會自動失效,當下一次訪問到來時,只存在cookie,此時后端會根據cookie存儲的user_id,獲取對應數據庫中的openId,將其加密后與cookie中的對比,如果一致則登錄成功,設置session為user_id,失敗則不登錄并且清空該錯誤的cookie。在成功自動登錄時還會檢查當前時間和cookie中的刷新時間,如果差距超過三個月,就會通過access_token重新刷新access_token。