使用 Abp.Zero 搭建第三方登入模組(一):原理篇

語言: CN / TW / HK

第三方登入是基於使用者在第三方平臺上(如微信,QQ, 百度)已有的賬號來快速完成系統的登入、註冊-登入等功能。

微信的鑑權

以微信的鑑權為例:

假如你的網站有一個掃碼登入的功能,會彈出一個由微信提供的二維碼頁面,你需要用手機上的微信掃碼,操作一下,就可以完成登入。如這個連結:

微信登入 (qq.com)


嗯。從研發和使用上來說這是最快捷,也是目前大部分站點用的掃碼登入方式。但這個是依賴於微信開放平臺的功能,微信作為鑑權服務的提供方,有義務監管第三方的網站(你的網站相對於微信就是第三方),因此你需要有企業或組織的營業執照,經過認證,才有資格申請這個功能。(聽說認證還需要交錢,OMG)

對於個人來說,這顯然不是一個可行的方式。

那麼我們還有兩個選擇:

1. 微信公眾號鑑權:你的網頁在微信客戶端中被訪問,通過跳轉至鑑權連結,彈出一個鑑權頁面,操作一下即可完成登入,請閱讀官方文件 網頁授權 | 微信開放文件 (qq.com)

這是不需要認證的,我認為從微信的角度來說,微信客戶端的瀏覽器控制元件作為整合在微信裡的功能,有能力把控鑑權連結是從已在微信後臺登記的合法域名跳轉的,但是你的網站仍然要備案和走https協議

2. 微信小程式鑑權:這與微信公眾號鑑權類似,區別是微信小程式SDK提供了登入功能,小程式不需要認證,可獲取用資訊, 請閱讀官方文件 wx.login(Object object) | 微信開放文件 (qq.com)

第三方登入的流程

首先使用者通過主動的確認授權,第三方平臺會生成一個登入憑證,根據第三方平臺的 使用者憑證 ,  登入憑證 ,返回 會話令牌 和使用者在 第三方賬號的唯一Id ,令牌用於獲取第三方平臺的賬號資訊,比如頭像,暱稱,地址,電話號碼等,如果使用者是第一次登入,則可以用這些賬號資訊建立一個系統賬號。

登入憑證和令牌,都具有時效性

在微信鑑權中,相關的概念的具體為:

  • 登入憑證:Code
  • 會話令牌:SessionKey
  • 賬號的唯一Id:OpenId
  • 使用者憑證:AppId、AppSecret

思考如何實現自己的登入邏輯:

公眾號的登入頁面,和微信小程式可以通過掃碼作為入口。再通過我們自己後端的鑑權服務,類似如下的流程

  1. 點選網頁微信小程式登入,網頁生成一個Token,呼叫getwxacode()介面,將scene設定為Token值,page設定為小程式鑑權頁面,生成小程式碼。
  2. 使用者使用微信客戶端掃碼,進入小程式鑑權頁面,從引數獲取 scene(就是 Token),並呼叫後端介面,將Token作為Key記錄至服務端Cache(Key/Value)中
  3. 使用者在小程式中點選同意登入,呼叫 wx.login() 獲取 Code,並呼叫後端介面,將該Code值錄入到以Token為Key的Value中
  4. 與此同時網頁在輪詢呼叫查詢Cache條目的介面,一旦獲取到Token對應的Code值,表明完成授權
  5. 網頁呼叫第三方登入介面,將Code值傳給後端服務作為登入憑證。呼叫相關微信第三方登入介面,以換取SessionKey,OpenId,再利用SessionKey查詢相關頭像,暱稱,地址,電話等資訊返回

使用者的操作路徑:


經過對比與思考,我們用呼叫方式更簡單的微信小程式的鑑權方式。後端採用.Net6 + Abp.Zero快速搭建使用者系統,利用Abp.Zero整合的第三方登入功能快速實現微信登入。為了節省時間還需要一個現成的微信SDK庫。

接下來,開始專案搭建

使用 Abp.Zero 搭建第三方登入模組(二):服務端開發 - 林曉lx - 部落格園 (cnblogs.com)