使用 Abp.Zero 搭建第三方登錄模組(一):原理篇
第三方登錄是基於用戶在第三方平台上(如微信,QQ, 百度)已有的帳號來快速完成系統的登錄、註冊-登錄等功能。
微信的鑒權
以微信的鑒權為例:
假如你的網站有一個掃碼登錄的功能,會彈出一個由微信提供的二維碼頁面,你需要用手機上的微信掃碼,操作一下,就可以完成登錄。如這個鏈接:
嗯。從研發和使用上來說這是最快捷,也是目前大部分站點用的掃碼登錄方式。但這個是依賴於微信開放平台的功能,微信作為鑒權服務的提供方,有義務監管第三方的網站(你的網站相對於微信就是第三方),因此你需要有企業或組織的營業執照,經過認證,才有資格申請這個功能。(聽說認證還需要交錢,OMG)
對於個人來說,這顯然不是一個可行的方式。
那麼我們還有兩個選擇:
1. 微信公眾號鑒權:你的網頁在微信客戶端中被訪問,通過跳轉至鑒權鏈接,彈出一個鑒權頁面,操作一下即可完成登錄,請閱讀官方文檔
這是不需要認證的,我認為從微信的角度來說,微信客戶端的瀏覽器控制項作為集成在微信里的功能,有能力把控鑒權鏈接是從已在微信後台登記的合法域名跳轉的,但是你的網站仍然要備案和走https協議
2. 微信小程式鑒權:這與微信公眾號鑒權類似,區別是微信小程式SDK提供了登錄功能,小程式不需要認證,可獲取用資訊, 請閱讀官方文檔
第三方登錄的流程
首先用戶通過主動的確認授權,第三方平台會生成一個登錄憑證,根據第三方平台的用戶憑證, 登錄憑證,返回會話令牌和用戶在第三方帳號的唯一Id,令牌用於獲取第三方平台的帳號資訊,比如頭像,昵稱,地址,電話號碼等,如果用戶是第一次登錄,則可以用這些帳號資訊建立一個系統帳號。
登錄憑證和令牌,都具有時效性
在微信鑒權中,相關的概念的具體為:
- 登錄憑證:Code
- 會話令牌:SessionKey
- 帳號的唯一Id:OpenId
- 用戶憑證:AppId、AppSecret
思考如何實現自己的登錄邏輯:
公眾號的登錄頁面,和微信小程式可以通過掃碼作為入口。再通過我們自己後端的鑒權服務,類似如下的流程
- 點擊網頁微信小程式登錄,網頁生成一個Token,調用getwxacode()介面,將scene設置為Token值,page設置為小程式鑒權頁面,生成小程式碼。
- 用戶使用微信客戶端掃碼,進入小程式鑒權頁面,從參數獲取 scene(就是 Token),並調用後端介面,將Token作為Key記錄至服務端Cache(Key/Value)中
- 用戶在小程式中點擊同意登錄,調用 wx.login() 獲取 Code,並調用後端介面,將該Code值錄入到以Token為Key的Value中
- 與此同時網頁在輪詢調用查詢Cache條目的介面,一旦獲取到Token對應的Code值,表明完成授權
- 網頁調用第三方登錄介面,將Code值傳給後端服務作為登錄憑證。調用相關微信第三方登錄介面,以換取SessionKey,OpenId,再利用SessionKey查詢相關頭像,昵稱,地址,電話等資訊返回
用戶的操作路徑:
經過對比與思考,我們用調用方式更簡單的微信小程式的鑒權方式。後端採用.Net6 + Abp.Zero快速搭建用戶系統,利用Abp.Zero集成的第三方登錄功能快速實現微信登錄。為了節省時間還需要一個現成的微信SDK庫。
接下來,開始項目搭建
使用 Abp.Zero 搭建第三方登錄模組(二):服務端開發 – 林曉lx – 部落格園 (cnblogs.com)