Laravel 5.1 - 通过Socialite进行Facebook身份验证

5
我试图在我的项目中实现Facebook登录,但是我收到了一个错误:
Middleware.php第69行的ClientException: 客户端错误:400
我已经完成以下步骤:
1. 运行命令 `composer require laravel/socialite` 和 `composer update`。 2. 在我的 `config>services.app` 中增加了以下内容:
'facebook' => [ 'client_id' => env('FB_CLIENT_ID'), 'client_secret' => env('FB_SECRET_ID'), 'redirect' => 'http://localhost.com:8888', ],
3. 在 `config>app.php` 中增加了 `Laravel\Socialite\SocialiteServiceProvider::class` 和 `'Socialite' => Laravel\Socialite\Facades\Socialite::class,`。 4. 成功设置路由。
``` Route::get('auth/facebook', 'Auth\AuthController@redirectToProvider'); Route::get('auth/facebook', 'Auth\AuthController@handleProviderCallback'); ```
  • Setup the link successfully in my blade file. Login with Facebook

  • In my Controller>AuthController.php, I added:

    use Laravel\Socialite\Facades\Socialite;
    
    ** Beside everything that AuthController has, inside the AuthController class, I added:**
    
      public function redirectToProvider()
       {
        return Socialite::driver('facebook')
             ->scopes(['scope1', 'scope2'])->redirect();
       }
    
    /**
     * Obtain the user information from Facebook.
     *
     * @return Response
     */
    
       public function handleProviderCallback()
        {
          $user = Socialite::driver('facebook')->user();
    
        // $user->token;
        }
    
  • Also users table:

       public function up()
        {
           Schema::create('users', function (Blueprint $table) {
              $table->increments('id');
              $table->string('username');
              $table->string('name');
              $table->string('email')->unique();
              $table->string('password', 60);
              $table->string('avatar');
              $table->string('provider');
              $table->string('provider_id');
              $table->rememberToken();
              $table->timestamps();
                });
        }
    

编辑: 当我注释掉$user = Socialite::driver('facebook')->user();这一部分时,我被重定向到localhost.com/auth/facebook

编辑2: 我的.env文件:

'facebook' => [ FB_CLIENT_ID => '###', FB_SECRET_ID => 'this-is-secret!', ],

4个回答

3
我认为你的两个路由不应该有相同的URL,因为 Laravel 无法知道使用哪一个。
Facebook 返回一个 ?code 参数,所以利用它!如果包含 ?code,则从 Socialite 处理登录逻辑,否则重定向到 Facebook。
你的代码中有两个未知的作用域,scope1 和 scope2,在尝试访问它们时会返回错误。使用真实的作用域(例如 public_profile 或 email)就可以了。(作用域是你在请求的权限)

好的,这两个相同的GET路由很可能会成为一个问题。 - ceejayoz
1
scopes(['scope1','scope2'])可能也会导致问题,如果您的控制器确实是这样的话,那么Facebook将不知道它们并且很可能会拒绝请求。 - Francismori7
我为第二个路由添加了 auth/facebook/callback,现在它正在重定向到 Facebook。但是,正如 @Francismori7 所说,在这里我收到一个错误:Facebook 错误 -> Invalid Scope: scope1。我应该完全删除 ->scopes(['scope1', 'scope2'])->redirect(); 部分吗? - senty
@senty,你应该包含你需要的权限范围!例如public_profile和email。 - Francismori7
@Francismori7,我将其留为return Socialite :: driver('facebook')->redirect();,现在它成功地重定向到FB,但现在我面临一个错误:Invalid App ID ->#MyAppid#,而我在链接栏上有OAuth客户端... fb.com/dialog/oauth?client_id=>+ bla bla bla bla bla - senty
显示剩余3条评论

2
确保 Laravel 正确调用您的配置条目:

请确保 Laravel 使用以下方式正确调用您的配置条目:

php artisan config:clear

同时,请检查您的.env文件中是否有FB_CLIENT_ID和FB_SECRET_ID条目。可能客户端无法连接到Facebook,因为它没有提供客户端和秘钥信息,从而导致异常。


我刚刚编辑了原始帖,展示了我的.env文件。我尝试过config:clear,但仍然没有运气。我还激活了Facebook应用程序以公开方式(变成绿色圆圈),但仍然出现相同的错误。 - senty
不要在这里发布你的 .env 文件!任何人都可以看到它,并且可能被我们中的任何人使用... - rotvulpix
我感到筋疲力尽。我已经花了将近一天的时间来解决这个问题,试图找出问题所在。你有什么线索吗? - senty
在您的 Facebook 应用程序设置页面中,您的网站 URL 是否已正确配置为 localhost? - rotvulpix
显示剩余3条评论

0

我曾经遇到过与Facebook API类似的问题 - 它返回了400响应代码,我刚刚尝试了:

composer require laravel/socialite & composer update

它更新了依赖项:

Updating dependencies (including require-dev) - Removing laravel/socialite (v2.0.11) - Installing laravel/socialite (v2.0.14)

我正在使用Laravel 5.1:

composer.json:

    "laravel/framework": "5.1.*",
    "laravel/socialite": "^2.0"

现在看起来它运行良好

希望这能帮助到某些人


0

我曾经遇到过同样的问题(Middleware.php第69行的ClientException:客户端错误:400)。 我只是在Facebook的高级设置中关闭了“需要应用程序秘密”,这解决了问题。也许这些信息会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接