使用 Laravel Socialite 登录 Facebook

Posted

技术标签:

【中文标题】使用 Laravel Socialite 登录 Facebook【英文标题】:Using Laravel Socialite to login to facebook 【发布时间】:2015-08-15 21:37:27 【问题描述】:

然而,我是 Laravel 的新手,我正在按照 http://www.codeanchor.net/blog/complete-laravel-socialite-tutorial/ 上的教程,通过 Facebook 将用户登录到我的应用程序中。但是,几乎在所有地方,我都能找到使用 Github 或 Twitter 的 Laravel 中提供的社交名流插件的教程。

我的问题是,按照教程中的所有内容,当我点击“登录 Facebook”按钮时,它会引发“无效参数异常”,并且没有指定社交名流驱动程序。”。

另一个堆栈溢出问题似乎缩小了范围: https://***.com/questions/29673898/laravel-socialite-invalidargumentexception-in-socialitemanager-php-line-138-n

说明问题出在 config/services.php

现在,我有了 app_id 和 app_secret。但是,重定向链接似乎令人困惑,因为我在 Facebook 上也找不到它。我知道这是我的应用程序应该去 Facebook 登录的地方,但是我不确定它应该是什么。

有人对此有任何想法吗?

【问题讨论】:

【参考方案1】:

2018 年更新 - laravel 5.6 - 社交名媛 3.0

对于看起来/应该很简单的东西来说有点棘手,但无论如何这就是我让事情适合我的方式。

服务器端

您可以在socialite docs 中找到这些说明和更多详细信息

安装

composer require laravel/socialite

配置

config/services.php添加

'facebook' => [

    'client_id'     => env('FACEBOOK_CLIENT_ID'),
    'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
    'redirect'      => env('FACEBOOK_CALLBACK_URL'),
],

.env文件中添加

FACEBOOK_CLIENT_ID=paste_client_id_here
FACEBOOK_CLIENT_SECRET=paste_client_secret_here
FACEBOOK_CALLBACK_URL=https://www.example.com/auth/facebook/callback

routes/web.php添加

Route::get('auth/facebook/', 'Auth\FacebookController@redirect')->name('auth.facebook');

Route::get('auth/facebook/callback', 'Auth\FacebookController@callback')->name('auth.facebook.callback');

App\Http\Controllers\Auth 中添加新控制器 FacebookController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\User;
use Socialite;

class FacebookController extends Controller 

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function redirect()
    
        return Socialite::driver('facebook')->redirect();
    


    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function callback(Request $request)
    
        try 

            $facebookAccount = Socialite::driver('facebook')->user();

            // your logic here...

            return redirect()->route('your.route.name');


         catch (Exception $e) 


            return redirect()->route('auth.facebook');
        
    

脸书方面

转到https://developers.facebook.com/apps 并创建新应用(如果您还没有)

并在这些屏幕截图中使您的应用设置如下所示:

重要提示

如果您在本地计算机上进行开发,则必须使用像 ngrok 这样的工具来提供到本地主机的安全链接。

在 facebook 登录设置中,使用 ngrok 提供的 url 更改 https://www.example.com,类似于 https://8b0215bc.ngrok.io

这是在我的本地机器上开发时对我有用的唯一方法。

【讨论】:

【参考方案2】:

在您的 composer.json 添加-"laravel/socialite": "~2.0",

"require": 
        "laravel/framework": "5.0.*",
        "laravel/socialite": "~2.0",

运行composer update

config/services.php 中添加:

//Socialite
    'facebook' => [
        'client_id'     => '1234567890444',
        'client_secret' => '1aa2af333336fffvvvffffvff',
        'redirect'      => 'http://laravel.dev/login/callback/facebook',
    ],

你需要创建两条路由,我的是这样的:

//Social Login
Route::get('/login/provider?',[
    'uses' => 'AuthController@getSocialAuth',
    'as'   => 'auth.getSocialAuth'
]);


Route::get('/login/callback/provider?',[
    'uses' => 'AuthController@getSocialAuthCallback',
    'as'   => 'auth.getSocialAuthCallback'
]);

你还需要像这样为上面的路由创建控制器:

<?php namespace App\Http\Controllers;

 use Laravel\Socialite\Contracts\Factory as Socialite;

 class AuthController extends Controller
 

       public function __construct(Socialite $socialite)
           $this->socialite = $socialite;
       


       public function getSocialAuth($provider=null)
       
           if(!config("services.$provider")) abort('404'); //just to handle providers that doesn't exist

           return $this->socialite->with($provider)->redirect();
       


       public function getSocialAuthCallback($provider=null)
       
          if($user = $this->socialite->with($provider)->user())
             dd($user);
          else
             return 'something went wrong';
          
       

 

最后像这样将站点 URL 添加到您的 Facebook 应用程序:

【讨论】:

如何创建facebook作为提供者来获取client_id和cilent_secret? @yudijohn,关于您的问题,您应该在 Facebook 中创建一个应用程序。无论如何,这是您应该作为新问题发布的内容。 如果您已经在config/services 中进行了重定向,您能解释一下第二条路由的作用吗? 要使您的服务中的重定向起作用,您必须创建一个将被调用的路由。在 Facebook 上进行身份验证后,它会重定向到回调 URL,因此如果路由不存在,您将收到 not found 错误 注册应用程序的简单方法在这里-youtube.com/watch?v=HIf0JW7JhcE【参考方案3】:

在你的 config/services.php 文件下创建一个提供者

'facebook' => [
    'client_id' => 'your-fb-client-id',
    'client_secret' => 'your-fb-secret',
    'redirect' => 'http://your-redirect.com/route',
],

现在您可以使用以下代码创建控制器

//this function will redirect users to facebook login page
public function facebook()

    return \Socialize::with('facebook')->redirect();


public function callback()

    $user = \Socialize::with('facebook')->user();

    //now we have user details in the $user array
     dd($user);


这是你的路线

Route::get('facebook', 'LoginController@facebook');

Route::get('callback', 'LoginController@callback');

【讨论】:

如何创建facebook作为提供者来获取client_id和cilent_secret?

以上是关于使用 Laravel Socialite 登录 Facebook的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 使用 Socialite(google、facebook 等)登录并创建我自己的应用程序的访问令牌

用户取消应用请求后,Laravel 5 Socialite Facebook 登录错误处理回调

Laravel Socialite 中的 Google 登录是不是包含用户的电话号码?

Laravel Socialite 与 Facebook 未登录

laravel的socialite微信登录之用户信息

在没有会话的情况下使用 laravel socialite 和 jwt-auth