摘要:在詳解中使用解決了第三方賬號登錄集成的問題,那么在獲取到用戶資料之后呢集成多個社交賬號,該如何綁定同一個賬號本篇就讓我們來探討一下集成登錄的那點事。
Dearmadman 在 Laravel Socialite 詳解 中使用 larastarscn/socialite 解決了第三方賬號登錄集成的問題,那么在獲取到用戶資料之后呢?集成多個社交賬號,該如何綁定同一個賬號?本篇就讓我們來探討一下集成登錄的那點事。
起初起初,當我們只需要集成單個社交登錄時,我們可能會為了快速的完成任務簡單粗暴的在用戶模型中加入 open_id 或者 github_id 類似的屬性,那么在數據庫中,我們需要在表中添加相應的字段。這是可以快速有效的完成任務的做法。
但是,當更多的需求來臨時,要求我們額外的集成一種或者多種社交登錄,那該怎么辦?難道我們還要任性的在表結構中添加相應的字段?
Schema::table("users", function ($table) { $table->string("github_id"); $table->string("douban_id"); });
這很明顯的違背了開放封閉原則,假如我們這么做,那么可以想象的當每多集成一種登錄時,我們就需要對數據表結構做出一次修正,并且,在登錄授權回調驗證時,還要增加一道集成驅動與字段查詢匹配的工序。
那應該怎么做?
設想這么想來,User 表是否承擔了過多的能力,它是否應該浪費自己的精力來管理這些社交標識?那不如我們安排 SocialiteUser 來專門管理用戶與社交賬號之間的關系?我們需要設計一種易擴展的方案來管理不同驅動的社交登錄,那么我們很容易的設計出這種表結構:
- socialite_users - id - user_id - driver - open_id
SocialiteUser 應該具有哪些職責?很顯然,它主要用來維護社交登錄標識和用戶模型之間的關系。那么它應該具有以下能力:
將社交登錄賬戶綁定到用戶模型上
獲取匹配的用戶模型
以下為簡單的代碼演示:
where([ "driver" => $driver, "open_id" => $openid ])->first(); return $finder ? $finder->user : $finder; } /** * get related user model. * * @return /App/User||null */ public function user() { return $this->belongsTo("AppUser"); } /** * Save a new record. * * @param $userId integer * @param $driver string * @param $id string * @return /App/SocialiteUser */ public function saveOne($userId, $driver, $id) { return $this->create([ "user_id" => $userId, "driver" => $driver, "open_id" => $id ]); } }使用
在授權登錄流程中,用戶同意授權,第三方應用將重定向到回調路由,回調路由中 Socialite 會主動請求獲取用戶資料,并將用戶的社交標識 ID 映射到 User 模型的 id 屬性上。
那么我們就可以在回調路由中根據驅動標識和用戶相應的社交標識 ID 來匹配查詢庫中是否已存在綁定的用戶。如果存在那就直接使用匹配到的用戶登錄,如果不存在,那么就生成一個用戶,并為這個用戶附加社交賬戶信息。然后使用新生成的賬戶登錄。
redirect(); } public function handleProviderCallback($driver) { $user = Socialite::driver($driver)->user(); $model = new User(); $socialiteUser = new SocialiteUser(); $finder = $socialiteUser->getUser($driver, $user->id); if (! $finder) { $finder = $model->generateUserInstance(); $finder->save(); $socialiteUser->saveOne($finder->id, $driver, $user->id); } Auth::login($finder); return view("home"); } }
這樣看來,如果需求一種新的社交登錄的集成,那么完全不需要做出其它代碼的改動,直接配置驅動就可以了。
PS: 歡迎關注簡書 Laravel 專題,也歡迎 Laravel 相關文章的投稿 :),作者知識技能水平有限,如果你有更好的設計方案歡迎討論交流,如果有錯誤的地方也請批評指正,在此表示感謝謝謝 :)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30484.html
摘要:本篇文章,主要講述了用戶登錄注冊的邏輯及如何用社交賬號登錄。僅供參考,具體情況依據產品需求而定。社交賬號登錄參數參數平臺渠道社交平臺開放驗證數據的合法性。若存在,直接進行登錄。若本站不存在賬號,引導用戶注冊,成功后與當前關聯即可。 本篇文章,主要講述了用戶登錄注冊的邏輯及如何用社交賬號登錄。 僅供參考,具體情況依據產品需求而定。 開放平臺有哪些? 微信 Sina微博 QQ 163 3...
摘要:驗證碼安全參考信息重放登錄注冊找密等入口,可能通過短信驗證碼郵箱驗證碼之類的進行確認操作,如果末對操作進行次數及頻率上的限制,則會產生大量的重放攻擊。高并發缺陷交易類重放攻擊,高并發的情況下末對用戶操作行為加鎖,導致購買限制的繞過。 showImg(https://segmentfault.com/img/bVBVVR); 業務安全從流程設計維度可劃分為賬戶體系安全、交易體系安全、支付...
摘要:阮一峰老師曾經在他的博文理解里對這個概念有了深入淺出的闡述。注這是阮一峰老師文章里提到的中的認證模式之一簡化模式客戶聽起來不錯這樣我就不需要把我們公司的用戶的密碼提供給您了。這下您放心了吧注這種方式即阮一峰文章里介紹的授權碼模式。 阮一峰老師曾經在他的博文理解OAuth 2.0里對這個概念有了深入淺出的闡述。 http://www.ruanyifeng.com/blo... 本文會結合...
摘要:阮一峰老師曾經在他的博文理解里對這個概念有了深入淺出的闡述。注這是阮一峰老師文章里提到的中的認證模式之一簡化模式客戶聽起來不錯這樣我就不需要把我們公司的用戶的密碼提供給您了。這下您放心了吧注這種方式即阮一峰文章里介紹的授權碼模式。 阮一峰老師曾經在他的博文理解OAuth 2.0里對這個概念有了深入淺出的闡述。 http://www.ruanyifeng.com/blo... 本文會結合...
閱讀 1526·2023-04-26 00:20
閱讀 1121·2023-04-25 21:49
閱讀 803·2021-09-22 15:52
閱讀 577·2021-09-07 10:16
閱讀 972·2021-08-18 10:22
閱讀 2664·2019-08-30 14:07
閱讀 2237·2019-08-30 14:00
閱讀 2651·2019-08-30 13:00