5

这里的另一个新手问题,但希望有人可以阐明:

我在 Laravel 5 中使用 Socialite,我希望能够在用户登录后将用户重定向到网站上的页面。问题是使用

return redirect('any-path-I-put-here');

只需重定向回“social-site/login?code=afkjadfkjdslkfjdlkfj...”(其中“social-site”是正在使用的任何网站,即 facebook、twitter、google 等)

因此,在我看来,Socialite/Contracts/Provider 接口中的 redirect() 函数会覆盖我事后尝试的任何重定向。

只是为了澄清,我的路线设置正确。我已经尝试了您可以想象的每个版本的“重定向”(“to”、“back”、“intended”、Redirect:: 等),并且该方法是从我的 Auth Controller 调用的(尽管我已经在其他地方尝试过)以及)。

问题是,一旦我完成了使用社交名流存储和登录用户,我该如何覆盖该 redirect() ?任何帮助表示赞赏!先感谢您。

包含相关重定向的代码是:

public function socialRedirect( $route, $status, $greeting, $user )
{

    $this->auth->login( $user, true );

    if( $status == 'new_user' ) {
        // This is a new member. Make sure they see the welcome modal on redirect
        \Session::flash( 'new_registration', true );

        return redirect()->to( $route );// This is just the most recent attempt. It originated with return redirect($route);, and has been attempted every other way you can imagine as well (as mentioned above). Hardcoding (i.e., 'home') returns the exact same result. The socialite redirect always overrides anything that is put here.
    }
    else {
        return redirect()->to( $route )->with( [ 'greeting' => $greeting ] );
    }
}

... 然而,在此之前运行的 SocialAuth 类大约有 500 行,因为它必须确定用户是否存在,必要时注册新用户,显示不同场景的表单等。同时,这里是函数通过 Social Auth 类发送信息:

private function socialLogin( $socialUser, $goto, $provider, $status, $controller )
{
    if( is_null( $goto ) ) {
        $goto = 'backlot/' . $socialUser->profile->custom_url;
    }

    if( $status == 'new_user' ) {
        return $controller->socialRedirect($goto, $status, null, $socialUser);
    }
    else {
        // This is an existing member. Show them the welcome back status message.
        $message = 'You have successfully logged in with your ' .
            ucfirst( $provider ) . ' credentials.';

        $greeting =
            flash()->success( 'Welcome back, ' . $socialUser->username . '. ' . $message );

        return $controller->socialRedirect($goto, $status, $greeting, $socialUser);
    }
}
4

3 回答 3

1

我相信你多虑了。使用社交名流非常简单:

设置config/services.php。对于facebook,我有这个:

 'facebook' => [
    'client_id' => 'your_fb_id',
    'client_secret' => 'your_fb_secret',
    'redirect' => '>ABSOLUTE< url to redirect after login', //like: 'http://stuff'
  ],

然后设置两条路由,一条用于登录,一条用于回调(登录后)。

在登录控制器方法中:

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

然后在回调函数中

$fb_user = \Socialize::with('facebook')->user();
// check if user exists, create it and whatnot
//dd($fb_user);
return redirect()->route('some.route');

对于所有其他提供商来说,它应该非常相似。

于 2015-05-30T06:17:34.717 回答
1

我设法解决了这个问题,但我不确定这是否是解决它的最佳方法。与上述问题类似,我从社交媒体获得了经过身份验证的回调,但我无法将当前响应重定向到另一个 url。

基于回调请求参数,我能够在我的 Laravel 应用程序中创建和验证用户。到目前为止它运行良好,但是当我尝试执行此步骤后出现问题return redirect()->route('dashboard');。我尝试了所有的redirect()助手和Redirect门面,但没有任何帮助。

在我检查这个问题之前,空白页只是盯着我的脸超过 2 天。行为非常相似。我从社交媒体重定向到我的应用程序,但无法在同一响应周期中进一步重定向。

此时(当应用程序收到回调并且用户通过身份验证时),如果我手动刷新页面(F5),我会被重定向到预期的页面。我的解释类似于之前在这个问题中所说的。来自社交媒体回调的重定向主导了我在控制器中触发的重定向(可能是 Laravel 应用程序中的重定向被抑制,因为来自社交媒体的重定向仍未完成)。这只是我的解释。如果专家不这么认为或有更好的解释,他们可以提出更多的观点。

为了解决这个问题,我使用了一个原始的 http 重定向header("Location /dashboard");并将 auth 中间件应用于这个路由。这样我可以模拟刷新功能,重定向到仪表板(或预期的 url)并在我的仪表板控制器中检查身份验证。

再一次,这不是一个完美的解决方案,我正在调查问题的实际根源,但是如果您面临类似的问题,这可能会帮助您继续前进。

于 2016-10-12T22:49:42.723 回答
0

我们在 UserController 中使用社交名流登录作为特征。我们简单地覆盖了控制器中的 AuthenticatesSocialiteLogin::loginSuccess()。

use Broco\SocialiteLogin\Auth\AuthenticatesSocialiteLogin;

class UserController extends BaseController
{
    use AuthenticatesSocialiteLogin;

    public function loginSuccess($user)
    {
        return redirect()->intended(url('/#login-success'));
    }

....
于 2017-02-20T19:36:02.463 回答