摘要:允許用戶提供一個(gè)令牌,而不是用戶名和密碼來訪問他們存放在特定服務(wù)提供者的數(shù)據(jù)。這樣,讓用戶可以授權(quán)第三方網(wǎng)站訪問他們存儲(chǔ)在另外服務(wù)提供者的某些特定信息,而非所有內(nèi)容。
Laravel Socialite
Laravel Socialite provides an expressive, fluent interface to OAuth authentication with Facebook, Twitter, Google, LinkedIn, GitHub and Bitbucket. It handles almost all of the boilerplate social authentication code you are dreading writing.
Laravel Socialite 為第三方應(yīng)用的 OAuth 認(rèn)證提供了非常豐富友好的接口,我們使用它可以非常方便快捷的對(duì)類似微信、微博等第三方登錄進(jìn)行集成。
Open AuthorizationOAuth(開放授權(quán))是一個(gè)開放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲(chǔ)的私密的資源(如照片,視頻,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用。
OAuth 允許用戶提供一個(gè)令牌,而不是用戶名和密碼來訪問他們存放在特定服務(wù)提供者的數(shù)據(jù)。每一個(gè)令牌授權(quán)一個(gè)特定的網(wǎng)站(例如,視頻編輯網(wǎng)站)在特定的時(shí)段(例如,接下來的 2 小時(shí)內(nèi))內(nèi)訪問特定的資源(例如僅僅是某一相冊(cè)中的視頻)。這樣,OAuth 讓用戶可以授權(quán)第三方網(wǎng)站訪問他們存儲(chǔ)在另外服務(wù)提供者的某些特定信息,而非所有內(nèi)容。
我們的應(yīng)用與使用 OAuth 標(biāo)準(zhǔn)的第三方應(yīng)用的交互流程一般是這樣的:
展示跳轉(zhuǎn)到第三方應(yīng)用登錄的鏈接
用戶點(diǎn)擊鏈接跳轉(zhuǎn)到第三方應(yīng)用登錄并進(jìn)行授權(quán)
在用戶授權(quán)后第三方應(yīng)用會(huì)跳轉(zhuǎn)到我們所指定的應(yīng)用回調(diào)資源地址并伴隨用于交互 AccessToken 的 Code
我們的應(yīng)用拿到 Code 后自主請(qǐng)求第三方應(yīng)用并使用 Code 獲取該用戶的 AccessToken
獲取 AccessToken 之后的應(yīng)用即可自主的從第三方應(yīng)用中獲取用戶的資源信息
Laravel Socialite UML 安裝 Laravel Socialite使用 Composer 進(jìn)行安裝:
composer require laravel/socialite配置
你需要在 config/app.php 的 providers 鍵中追加:
"providers" => [ // Other service providers... LaravelSocialiteSocialiteServiceProvider::class, ],
在 aliasses 鍵中添加 Socialite:
"Socialite" => LaravelSocialiteFacadesSocialite::class,
在 config/services.php 配置文件中添加驅(qū)動(dòng)器配置項(xiàng):
"github" => [ "client_id" => "your-github-app-id", "client_secret" => "your-github-app-secret", "redirect" => "http://your-callback-url", ],
至此整個(gè)流程安裝完畢。
集成微信登錄集成微信我們需要提供一個(gè) WechatServiceProvider 和 一個(gè) WechatProvider,用這兩個(gè)文件來為微信登錄提供驅(qū)動(dòng),Laravel Socialite 的 SocialiteManager 繼承自 IlluminateSupportManager 類,而其對(duì)自定義驅(qū)動(dòng)提供了友好的接口支持,所以我們可以手動(dòng)的添加一個(gè) Wechat 驅(qū)動(dòng)器:
openId = $openId; return $this; } /** * {@inheritdoc}. */ protected $scopes = ["snsapi_login"]; /** * {@inheritdoc}. */ public function getAuthUrl($state) { return $this->buildAuthUrlFromBase("https://open.weixin.qq.com/connect/qrconnect", $state); } /** * {@inheritdoc}. */ protected function buildAuthUrlFromBase($url, $state) { $query = http_build_query($this->getCodeFields($state), "", "&", $this->encodingType); return $url."?".$query."#wechat_redirect"; } /** * {@inheritdoc}. */ protected function getCodeFields($state = null) { return [ "appid" => $this->clientId, "redirect_uri" => $this->redirectUrl, "response_type" => "code", "scope" => $this->formatScopes($this->scopes, $this->scopeSeparator), "state" => $state, ]; } /** * {@inheritdoc}. */ public function getTokenUrl() { return "https://api.weixin.qq.com/sns/oauth2/access_token"; } /** * {@inheritdoc}. */ public function getUserByToken($token) { $response = $this->getHttpClient()->get("https://api.weixin.qq.com/sns/userinfo", [ "query" => [ "access_token" => $token, "openid" => $this->openId, "lang" => "zh_CN", ], ]); return json_decode($response->getBody(), true); } /** * {@inheritdoc}. */ public function mapUserToObject(array $user) { return (new User())->setRaw($user)->map([ "openid" => $user["openid"], "nickname" => $user["nickname"], "avatar" => $user["headimgurl"], "name" => $user["nickname"], "email" => null, "unionid" => $user["unionid"] ]); } /** * {@inheritdoc}. */ protected function getTokenFields($code) { return [ "appid" => $this->clientId, "secret" => $this->clientSecret, "code" => $code, "grant_type" => "authorization_code", ]; } /** * {@inheritdoc}. */ public function getAccessTokenResponse($code) { $postKey = (version_compare(ClientInterface::VERSION, "6") === 1) ? "form_params" : "body"; $response = $this->getHttpClient()->post($this->getTokenUrl(), [ "headers" => ["Accept" => "application/json"], $postKey => $this->getTokenFields($code), ]); $responseBody = json_decode($response->getBody(), true); $this->setOpenId($responseBody["openid"]); return $responseBody; } }
編寫完驅(qū)動(dòng)之后我們需要注冊(cè)該驅(qū)動(dòng)器到 SocialiteManager 中,因此我們編寫一個(gè) WechatServiceProvider:
app->make("LaravelSocialiteContractsFactory")->extend("wechat", function ($app) { $config = $app["config"]["services.wechat"]; return new WechatProvider( $app["request"], $config["client_id"], $config["client_secret"], $config["redirect"] ); }); } public function register() { } }
接著我們就可以添加配置項(xiàng)及將服務(wù)提供者注冊(cè)到 Laravel 中:
// app.php "providers" => [ // Other service providers... CrowdfundingProvidersSocialiteWechatServiceProvider::class, ], // services.php "wechat" => [ "client_id" => "appid", "client_secret" => "appSecret", "redirect" => "http://xxxxxx.proxy.qqbrowser.cc/oauth/callback/driver/wechat", ]
緊接著添加路由及控制器:
// route.php Route::group(["middleware" => "web"], function () { Route::get("oauth/callback/driver/{driver}", "OAuthAuthorizationController@handleProviderCallback"); Route::get("oauth/redirect/driver/{driver}", "OauthAuthorizationController@redirectToProvider"); });
控制器:
redirect(); } public function handleProviderCallback($driver) { $user = Socialite::driver($driver)->user(); // dd($user) } }
至此集成完畢。
PS: 歡迎關(guān)注簡(jiǎn)書 Laravel 專題,也歡迎 Laravel 相關(guān)文章的投稿 :),作者知識(shí)技能水平有限,如果你有更好的設(shè)計(jì)方案歡迎討論 :)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/21859.html
摘要:這樣,讓用戶可以授權(quán)第三方網(wǎng)站訪問他們存儲(chǔ)在另外服務(wù)提供者的某些特定信息,而非所有內(nèi)容。 不久之前 Dearmadman 曾寫過一篇 使用 Laravel Socialite 集成微信登錄 的文章,但是似乎還是有些同學(xué)不太明白,詢問著如何集成 QQ 登錄,那么,本篇我們就來剖析一下 Laravel Socialite 的詳細(xì)內(nèi)容。讓各位同學(xué)都獲得 Laravel Socialite 所...
摘要:目前支持的認(rèn)證有。英文不好的同學(xué)比如我,下面是中文文檔通過擴(kuò)展的,實(shí)現(xiàn)了很多第三方認(rèn)證。國內(nèi)的有微博微信豆瓣。至于和的具體值,這個(gè)是由新浪微博分發(fā)給你的,在新浪微博的授權(quán)回調(diào)頁中填寫。 前言 第三方登錄認(rèn)證能簡(jiǎn)化用戶登錄/注冊(cè)的操作,降低用戶登錄/注冊(cè)的門檻,對(duì)提高應(yīng)用的用戶轉(zhuǎn)化率很有幫助。 Socialite Laravel 為我們提供了簡(jiǎn)單、易用的方式,使用 Laravel Soc...
摘要:在詳解中使用解決了第三方賬號(hào)登錄集成的問題,那么在獲取到用戶資料之后呢集成多個(gè)社交賬號(hào),該如何綁定同一個(gè)賬號(hào)本篇就讓我們來探討一下集成登錄的那點(diǎn)事。 Dearmadman 在 Laravel Socialite 詳解 中使用 larastarscn/socialite 解決了第三方賬號(hào)登錄集成的問題,那么在獲取到用戶資料之后呢?集成多個(gè)社交賬號(hào),該如何綁定同一個(gè)賬號(hào)?本篇就讓我們來探討...
摘要:查找保存下載用搭建自己的緩存?zhèn)}庫權(quán)限管理的好選擇基于封裝的后臺(tái)管理系統(tǒng),支持手機(jī)和端訪問支付寶風(fēng)格的驗(yàn)證器后臺(tái)系統(tǒng)微信接口的部署腳本開發(fā)的博客系統(tǒng)百度推送自動(dòng)記錄用戶行為擴(kuò)展一個(gè)項(xiàng)目管理系統(tǒng)根據(jù)生成對(duì)應(yīng)導(dǎo)航的狀態(tài) 1.debug https://github.com/barryvdh/l... showImg(https://segmentfault.com/img/bVmhWL); ...
摘要:本文整理上國內(nèi)相對(duì)較常用及以上版本的擴(kuò)展包代碼生成文檔對(duì)象云存儲(chǔ)文檔消息閃存文檔編輯器代碼提示文檔文檔文檔圖片處理文檔微信開發(fā)文檔語言包文檔驗(yàn)證碼文檔社會(huì)化登陸文檔系統(tǒng)日志文檔前端構(gòu)建工具文檔跨域資源共享文檔基于的用戶認(rèn) 本文整理Github上國內(nèi)相對(duì)較常用Laravel5及以上版本的擴(kuò)展包 laravel-generator(代碼生成) Github:https://github....
閱讀 2078·2021-10-08 10:21
閱讀 2471·2021-09-29 09:34
閱讀 3494·2021-09-22 15:51
閱讀 4926·2021-09-22 15:46
閱讀 2314·2021-08-09 13:42
閱讀 3434·2019-08-30 15:52
閱讀 2723·2019-08-29 17:13
閱讀 1555·2019-08-29 11:30