laravel5實現第三方登陸(微信)

背景

最近手頭一個項目須要實現用戶在網站的第三方登陸(微信和微博),後端框架laravel5.4。php

實現過程以微信網頁版第三方登陸,其餘於此相似,在此不作重複。html

 

準備工做

網站應用微信登陸是基於OAuth2.0協議標準構建的微信OAuth2.0受權登陸系統。
在進行微信OAuth2.在進行微信OAuth2.0受權登陸接入以前,在微信開放平臺註冊開發者賬號,並擁有一個已審覈經過的網站應用,並得到相應的AppID和AppSecret,申請微信登陸且經過審覈後,可開始接入流程。laravel

總結下來就是:git

  1. 進入微信開放平臺註冊開發者帳號
  2. 根據項目類型建立應用,再此我建立的是網站應用.
  3. 接入微信登錄功能,讓用戶可以使用微信登陸你的網站應用
  4. 得到AppID和AppSectet

到此微信第三方登陸的準備工做就完成了。github

 

受權流程說明

1. 第三方發起微信受權登陸請求,微信用戶容許受權第三方應用後,微信會拉起應用或重定向到第三方網站,而且帶上受權臨時票據code參數;
2. 經過code參數加上AppID和AppSecret等,經過API換取access_token;
3. 經過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操做。web

 

在框架中實現(laravel)

Laravel Socialite簡介後端

除了傳統的基於表單的登陸認證外,Laravel 還能夠經過 Laravel Socialite 提供 OAuth 認證,目前支持的認證驅動包括 Facebook、Twitter、Google、LinkedIn、GitHub 和 Bitbucket。微信

安裝相關依賴app

composer require laravel/socialite
安裝weixin-web
composer require socialiteproviders/weixin-web
注意網站實現微信登陸須要的依賴包爲socialiteproviders/weixin-web,若是是手機端App那麼能夠用socialiteproviders/weixin。
shanlei@shanlei-Lenovo-ideapad-110-15ISK:/var/www/html/zslm_back$ composer search socialiteproviders/weixin
socialiteproviders/weixin Weixin OAuth2 Provider for Laravel Socialite
socialiteproviders/weixin-web Weixin-Web OAuth2 Provider for Laravel Socialite
socialiteproviders/weixin-web Weixin-Web OAuth2 Provider for Laravel Socialite
socialiteproviders/weixin Weixin OAuth2 Provider for Laravel Socialite

相關配置composer

1. 設置app/config.php

添加providers:

'providers' => [
    SocialiteProviders\Manager\ServiceProvider::class,
],

添加aliases:

'aliases' => [ 
    'Socialite' => Laravel\Socialite\Facades\Socialite::class, 
],

2. 配置config/services.php

    'weixinweb' => [
        'client_id' => env('WEIXIN_KEY'),
        'client_secret' => env('WEIXIN_SECRET'),
        'redirect' => env('WEIXIN_REDIRECT_URI'),
    ],

3. 設置app/Providers/EventServiceProvider.php

添加事件監聽

use SocialiteProviders\Manager\SocialiteWasCalled;

    protected $listen = [
        'SocialiteProviders\Manager\SocialiteWasCalled' => [
            'SocialiteProviders\WeixinWeb\WeixinWebExtendSocialite@handle',
        ],
    ];
4. 添加路由
Route::get('auth/weixin', 'Auto\ThirdLogin\WeixinController@redirectToProvider');
Route::get('auth/weixin/callback','Auto\ThirdLogin\WeixinController@handleProviderCallback');

5. 編寫WeixinController

<?php
/**
 * Created by PhpStorm.
 * User: shanlei
 * Date: 1/6/2017
 * Time: 11:34 AM
 */

namespace App\Http\Controllers\Auto\ThirdLogin;

use Socialite;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use SocialiteProviders\WeixinWeb\Provider;

class WeixinController extends Controller{
    public function redirectToProvider(Request $request)
    {   
        return Socialite::with('weixinweb')->redirect();
    }

    public function handleProviderCallback(Request $request)
    {
        $user_data = Socialite::with('weixinweb')->stateless()->user();
        dd($user_data);
    }
}

訪問auth/weixin,得到返回數據。

 

 

常見錯誤

1. 微信受權回調域不符(redirect_uri不符),參見下面規範:

2. 執行過程當中出現一下錯誤:

exception 'Laravel\Socialite\Two\InvalidStateException' 
in /example/vendor/laravel/socialite/src/Two/AbstractProvider.php:161

解決:

經過stateless()方法禁止會話狀態驗證

Socialite::driver('weixinweb')->stateless()->user()

 

其餘第三方登陸在此不作贅述。

相關文章
相關標籤/搜索