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

时间:2015-11-05 16:11:43

标签: laravel laravel-5.1 laravel-socialite

我正在使用Socialite进行Facebook注册/身份验证,当用户接受Facebook上的所有权限时,它工作得很好。 但是当用户拒绝其中一项权限时,我遇到了问题 - 尤其是我的应用程序创建帐户所需的电子邮件。如果用户错误地做了它并且仍然想使用Facebook身份验证我必须使用auth_type = rerequest发送到Facebook API请求

来自Facebook文档:

  

如果有人拒绝了您的应用的权限,则登录对话框不会让您的应用重新请求权限,除非您将auth_type = rerequest与您的请求一起传递。

有没有办法通过社交网站发送?

2 个答案:

答案 0 :(得分:4)

修改

我刚刚找到解决方案:

auth_type=rerequest添加新的redirect()参数,为了在您的控制器中创建一个方法,可以在拒绝权限后重定向用户,然后将方法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

答案 1 :(得分:0)

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

来自facebook的说明:

  

请注意,即使您申请电子邮件权限,也不能保证   你会得到一个电子邮件地址。例如,如果有人注册了   Facebook上有电话号码而不是电子邮件地址,电子邮件   字段可能是空的。

源:facebook Documentation for Permissions