Laravel 5 Socialite 如何向 Facebook 发送重新请求 (auth_type=rerequest)

Laravel 5 Socialite how to send rerequest (auth_type=rerequest) to Facebook

我正在为 Facebook registration/authentication 使用 Socialite,当用户接受 Facebook 上的所有权限时,它运行良好。 但是当用户拒绝其中一项许可时我遇到了问题 - 特别是 e-mail 在我的应用程序中创建帐户所必需的。如果用户做错了并且仍然想使用 Facebook 身份验证,我必须向 Facebook API 发送 auth_type=rerequest

请求

来自 Facebook 文档:

If someone has declined a permission for your app, the login dialog won't let your app re-request the permission unless you pass auth_type=rerequest along with your request.

有什么方法可以通过 Socialite 发送吗?

编辑:

我刚找到解决方案:

redirect() 添加一个新的 auth_type=rerequest 参数,为此在您的控制器中创建一个方法,用户可以在拒绝权限后重定向该方法,然后设置该方法 with() 将 rerequest 参数附加到 URL,如下所示:

public function redirect(Socialite $socialite)
{
    return $socialite->driver('facebook')->with(['auth_type' => 'rerequest'])->redirect();
}

Socialite 暂时不提供开箱即用的 ReRequest 的另一种解决方法,因此在这种情况下,您在收到用户拒绝的 Socialite 用户响应后从用户 Facebook 帐户取消对您的应用程序的授权电子邮件权限,然后从登录页面提醒用户他必须授予您继续使用 Facebook 登录您的应用程序的权限,因此下次用户单击登录按钮时,他将再次看到一个 Facebook 对话框,其中他可以授予所有权限。

    /**@var \Laravel\Socialite\Two\User $retrieveUser*/
    $retrieveUser = $social->driver($provider)->user();
    $client = new \GuzzleHttp\Client;
    $response = $client->delete("https://graph.facebook.com/{$retrieveUser->id}/permissions",
        [
            'headers' => [
                'Accept' => 'application/json',
            ],
            'form_params' => [
                'access_token' => $retrieveUser->token
            ]
        ]
    );

因为这个解决方法不遵循 Facebook 的最佳实践,我还建议您使用另一个具有此选项的包 https://github.com/SammyK/LaravelFacebookSdk

使用 facebook 的另一个重要方面是不要假设用户将始终使用 facebook 注册的电子邮件。

来自 Facebook 的备注:

Note, even if you request the email permission it is not guaranteed you will get an email address. For example, if someone signed up for Facebook with a phone number instead of an email address, the email field may be empty.

来源:facebook Documentation for Permissions