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 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.