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