在 laravel 中使用社交名流登录 Facebook

Posted

技术标签:

【中文标题】在 laravel 中使用社交名流登录 Facebook【英文标题】:Facebook login using socialite in laravel 【发布时间】:2019-06-21 04:33:01 【问题描述】:

在 laravel 中使用社交精简版遵循 facebook Oauth 的过程

https://itsolutionstuff.com/post/laravel-56-login-with-facebook-with-socialiteexample.html

但是在我设置之后,我遇到了像 ERR_TOO_MANY_REDIRECTS 这样的问题。

这是它重定向我的链接:

https://www.facebook.com/v3.0/dialog/oauth?client_id=xxxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%2Ffesbok%2Fpublic%2Fauth%2Ffacebook%2Fcallback&scope=email&response_type=code&state=0R4djYkaHGFEHcXF8CDZQEC52TGvzA82jr77PPp5#=

可能的问题是什么?我相信跟随一切。请让我知道我错过了什么。

【问题讨论】:

在第 5 步中,每当处理回调时出现问题,它会再次重定向到 auth/facebook,尝试再次触发整个身份验证过程。删除该重定向,然后检查此时异常实际上要说什么- @04FS 感谢您的评论。它可以帮助我调试问题。 【参考方案1】:

这是我在 PROD 中用于辅助项目的代码。到目前为止工作没有任何问题。

我希望它可以帮助您完成这个棘手的事情 :D,因为您可以看到它比看起来更容易。

错误可能是您设置路由以处理身份验证和回调的方式,对我来说,您似乎对两者都有相同的路由,并且当 Facebook 批准并将用户发回时,您的网站再次重定向到 OAuth 端点等等。

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Response;
use Laravel\Socialite\Facades\Socialite;

class LoginController extends Controller

    /**
     * Redirect the user to the GitHub authentication page.
     *
     * @param $provider
     * @return Response
     */
    public function redirectToProvider($provider)
    
        return Socialite::driver($provider)->redirect();
    

    /**
     * Obtain the user information from GitHub.
     *
     * @param $provider
     * @return Response
     */
    public function handleProviderCallback($provider)
    
        $user = Socialite::driver($provider)->user();

        $authUser = $this->findOrCreateUser($user, $provider);

        auth()->login($authUser, true);

        return redirect('/home');
    

    /**
     * Finds or creates an user.
     *
     * @param $user
     * @param $provider
     * @return mixed
     */
    public function findOrCreateUser($user, $provider)
    
        $authUser = User::where('provider_id', $user->id)->first();
        if ($authUser) 
            return $authUser;
        

        return User::create([
          'name'     => $user->name,
          'email'    => $user->email,
          'provider' => $provider,
          'provider_id' => $user->id,
      ]);
    

这就是我们设置服务的方式(您也可以使用路由功能来代替 env )。

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Third Party Services
    |--------------------------------------------------------------------------
    |
    | This file is for storing the credentials for third party services such
    | as Stripe, Mailgun, SparkPost and others. This file provides a sane
    | default location for this type of information, allowing packages
    | to have a conventional place to find your various credentials.
    |
    */

    'twitter' => [
       'client_id' => env('TWITTER_CLIENT_ID', ''),
       'client_secret' => env('TWITTER_CLIENT_SECRET', ''),
       'redirect' => env('APP_URL', '').'/auth/twitter/callback',
      ],

    'facebook' => [
       'client_id' => env('FACEBOOK_CLIENT_ID', ''),
       'client_secret' => env('FACEBOOK_CLIENT_SECRET', ''),
       'redirect' => env('APP_URL', '').'/auth/facebook/callback',
      ],

    'google' => [
       'client_id' => env('GOOGLE_CLIENT_ID', ''),
       'client_secret' => env('GOOGLE_CLIENT_SECRET', ''),
       'redirect' => env('APP_URL', '').'/auth/google/callback',
      ],
];
//Routes for socialite
Route::get('auth/provider', 'LoginController@redirectToProvider');
Route::get('auth/provider/callback', 'LoginController@handleProviderCallback');

【讨论】:

非常感谢!这对我有很大帮助 如果它真的有帮助,如果你能把它标记为解决方案就好了:D,总是乐于提供帮助。

以上是关于在 laravel 中使用社交名流登录 Facebook的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中使用社交名流和护照创建 REST API

如何减少 Laravel 5 中的社交名流范围?

Laravel 社交名流推特

Laravel 5.2.31 社交名流证书 ssl 错误

如何测试 Laravel 社交名流

Laravel 社交名流:InvalidStateException(有时)