成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用 Laravel Socialite 集成微信登錄

hufeng / 3492人閱讀

摘要:允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數(shù)據(jù)。這樣,讓用戶可以授權第三方網(wǎng)站訪問他們存儲在另外服務提供者的某些特定信息,而非所有內(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 為第三方應用的 OAuth 認證提供了非常豐富友好的接口,我們使用它可以非常方便快捷的對類似微信、微博等第三方登錄進行集成。

Open Authorization

OAuth(開放授權)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網(wǎng)站上存儲的私密的資源(如照片,視頻,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應用。

OAuth 允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數(shù)據(jù)。每一個令牌授權一個特定的網(wǎng)站(例如,視頻編輯網(wǎng)站)在特定的時段(例如,接下來的 2 小時內(nèi))內(nèi)訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth 讓用戶可以授權第三方網(wǎng)站訪問他們存儲在另外服務提供者的某些特定信息,而非所有內(nèi)容。

我們的應用與使用 OAuth 標準的第三方應用的交互流程一般是這樣的:

展示跳轉(zhuǎn)到第三方應用登錄的鏈接

用戶點擊鏈接跳轉(zhuǎn)到第三方應用登錄并進行授權

在用戶授權后第三方應用會跳轉(zhuǎn)到我們所指定的應用回調(diào)資源地址并伴隨用于交互 AccessToken 的 Code

我們的應用拿到 Code 后自主請求第三方應用并使用 Code 獲取該用戶的 AccessToken

獲取 AccessToken 之后的應用即可自主的從第三方應用中獲取用戶的資源信息

Laravel Socialite UML

安裝 Laravel Socialite

使用 Composer 進行安裝:

composer require laravel/socialite
配置

你需要在 config/app.phpproviders 鍵中追加:

"providers" => [
    // Other service providers...

    LaravelSocialiteSocialiteServiceProvider::class,
],

aliasses 鍵中添加 Socialite:

"Socialite" => LaravelSocialiteFacadesSocialite::class,

config/services.php 配置文件中添加驅(qū)動器配置項:

"github" => [
    "client_id" => "your-github-app-id",
    "client_secret" => "your-github-app-secret",
    "redirect" => "http://your-callback-url",
],

至此整個流程安裝完畢。

集成微信登錄

集成微信我們需要提供一個 WechatServiceProvider 和 一個 WechatProvider,用這兩個文件來為微信登錄提供驅(qū)動,Laravel Socialite 的 SocialiteManager 繼承自 IlluminateSupportManager 類,而其對自定義驅(qū)動提供了友好的接口支持,所以我們可以手動的添加一個 Wechat 驅(qū)動器:

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ū)動之后我們需要注冊該驅(qū)動器到 SocialiteManager 中,因此我們編寫一個 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()
    {

    }
}

接著我們就可以添加配置項及將服務提供者注冊到 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: 歡迎關注簡書 Laravel 專題,也歡迎 Laravel 相關文章的投稿 :),作者知識技能水平有限,如果你有更好的設計方案歡迎討論 :)

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21859.html

相關文章

  • Laravel Socialite 詳解

    摘要:這樣,讓用戶可以授權第三方網(wǎng)站訪問他們存儲在另外服務提供者的某些特定信息,而非所有內(nèi)容。 不久之前 Dearmadman 曾寫過一篇 使用 Laravel Socialite 集成微信登錄 的文章,但是似乎還是有些同學不太明白,詢問著如何集成 QQ 登錄,那么,本篇我們就來剖析一下 Laravel Socialite 的詳細內(nèi)容。讓各位同學都獲得 Laravel Socialite 所...

    yuanxin 評論0 收藏0
  • Laravel5.1 實現(xiàn)第三方登錄認證(包括微博、QQ、微信、豆瓣)

    摘要:目前支持的認證有。英文不好的同學比如我,下面是中文文檔通過擴展的,實現(xiàn)了很多第三方認證。國內(nèi)的有微博微信豆瓣。至于和的具體值,這個是由新浪微博分發(fā)給你的,在新浪微博的授權回調(diào)頁中填寫。 前言 第三方登錄認證能簡化用戶登錄/注冊的操作,降低用戶登錄/注冊的門檻,對提高應用的用戶轉(zhuǎn)化率很有幫助。 Socialite Laravel 為我們提供了簡單、易用的方式,使用 Laravel Soc...

    nifhlheimr 評論0 收藏0
  • 淺談多個社交賬號的綁定設計

    摘要:在詳解中使用解決了第三方賬號登錄集成的問題,那么在獲取到用戶資料之后呢集成多個社交賬號,該如何綁定同一個賬號本篇就讓我們來探討一下集成登錄的那點事。 Dearmadman 在 Laravel Socialite 詳解 中使用 larastarscn/socialite 解決了第三方賬號登錄集成的問題,那么在獲取到用戶資料之后呢?集成多個社交賬號,該如何綁定同一個賬號?本篇就讓我們來探討...

    wean 評論0 收藏0
  • laravel package收集

    摘要:查找保存下載用搭建自己的緩存?zhèn)}庫權限管理的好選擇基于封裝的后臺管理系統(tǒng),支持手機和端訪問支付寶風格的驗證器后臺系統(tǒng)微信接口的部署腳本開發(fā)的博客系統(tǒng)百度推送自動記錄用戶行為擴展一個項目管理系統(tǒng)根據(jù)生成對應導航的狀態(tài) 1.debug https://github.com/barryvdh/l... showImg(https://segmentfault.com/img/bVmhWL); ...

    psychola 評論0 收藏0
  • Laravel優(yōu)秀擴展包整理

    摘要:本文整理上國內(nèi)相對較常用及以上版本的擴展包代碼生成文檔對象云存儲文檔消息閃存文檔編輯器代碼提示文檔文檔文檔圖片處理文檔微信開發(fā)文檔語言包文檔驗證碼文檔社會化登陸文檔系統(tǒng)日志文檔前端構建工具文檔跨域資源共享文檔基于的用戶認 本文整理Github上國內(nèi)相對較常用Laravel5及以上版本的擴展包 laravel-generator(代碼生成) Github:https://github....

    lykops 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<