如何让用户在同一个页面选择不同的Facebook权限?
How to let a user choose different Facebook permissions in the same page?
假设你想用 Facebook PHP SDK 建立一个网页,你想让用户 select Facebook 将 return 到服务器的信息。我提供了以下代码,以允许用户选择允许 Facebook 仅发送基本配置文件或也发送由该用户管理的页面。
session_start();
// Load the Facebook PHP SDK
require_once __DIR__ . '/facebook-sdk-v5/autoload.php';
define('APP_ID', 'xxxxxxxxxxx');
define('APP_SECRET', 'xxxxxxxxxxxxxxxxxxxx');
$fbProfile = new Facebook\Facebook([
'app_id' => APP_ID,
'app_secret' => APP_SECRET,
'default_graph_version' => 'v2.7'
]);
$fbPages = new Facebook\Facebook([
'app_id' => APP_ID,
'app_secret' => APP_SECRET,
'default_graph_version' => 'v2.7'
]);
$helperProfile = $fbProfile->getRedirectLoginHelper();
$redirectUrlProfile = 'http://www.example.com/link1.php';
$loginUrlProfile = $helperProfile->getLoginUrl($redirectUrlProfile);
echo '<a href="' . $loginUrlProfile . '">Get profile with Facebook!</a><br>';
$helperPages = $fbPages->getRedirectLoginHelper();
$permissions = ['pages_show_list']; // Optional permissions
$redirectUrlPages = "http://www.example.com/link2.php";
$loginUrlPages = $helperPages->getLoginUrl($redirectUrlPages, $permissions);
echo '<a href="' . $loginUrlPages . '">Get pages with Facebook!</a>';
如果我使用上面的代码(评论不相关的部分)只有 一个 facebook 对象来检索个人资料或用户管理的页面(但不是两者) ,一切正常。但是,如果我同时使用 both 个对象来为用户提供选择,我会得到 FacebookSDKException
。我想这是由于 CRSF cookies 造成的。
有什么办法可以避免这个问题吗?
I guess this is due to CRSF cookies.
正确。调用 getLoginUrl
方法会创建一个新的随机 state
值并将其写入会话,覆盖之前存储的任何值。
因此,如果您两次(或更多次)调用该方法,则只有您通过最后一次创建的登录 URL 调用登录对话框时,登录才会起作用,因为只有它包含与该登录相匹配的状态值存储在会话中。
如果您想继续使用两个不同的重定向 URI,那么您需要执行一个额外的步骤来创建正确的登录 URL,并且 仅 那个。
因此您的页面中有两个链接,都指向您服务器上的脚本,并通过 GET 参数传递要请求的权限(无论您是想直接传递权限名称,还是只是像 ?loginmode=1
/?loginmode=2
,由你决定。)
在该脚本中,您决定使用哪个重定向 URI 和范围值来调用 getLoginUrl 方法 - once。然后你的脚本只是重定向到那个登录 URL.
(但请记住,为访问令牌交换代码的步骤也需要传递重定向 URI 参数,一次又一次地使用 exact 相同的值用于登录对话框调用。)
所以按照@luschn 在评论中建议的方式进行操作,使用 JS SDK 进行登录,可能会容易得多。 FB.login
可以从客户端 JS 代码中的不同点以不同的范围调用而不会出现任何此类问题。
假设你想用 Facebook PHP SDK 建立一个网页,你想让用户 select Facebook 将 return 到服务器的信息。我提供了以下代码,以允许用户选择允许 Facebook 仅发送基本配置文件或也发送由该用户管理的页面。
session_start();
// Load the Facebook PHP SDK
require_once __DIR__ . '/facebook-sdk-v5/autoload.php';
define('APP_ID', 'xxxxxxxxxxx');
define('APP_SECRET', 'xxxxxxxxxxxxxxxxxxxx');
$fbProfile = new Facebook\Facebook([
'app_id' => APP_ID,
'app_secret' => APP_SECRET,
'default_graph_version' => 'v2.7'
]);
$fbPages = new Facebook\Facebook([
'app_id' => APP_ID,
'app_secret' => APP_SECRET,
'default_graph_version' => 'v2.7'
]);
$helperProfile = $fbProfile->getRedirectLoginHelper();
$redirectUrlProfile = 'http://www.example.com/link1.php';
$loginUrlProfile = $helperProfile->getLoginUrl($redirectUrlProfile);
echo '<a href="' . $loginUrlProfile . '">Get profile with Facebook!</a><br>';
$helperPages = $fbPages->getRedirectLoginHelper();
$permissions = ['pages_show_list']; // Optional permissions
$redirectUrlPages = "http://www.example.com/link2.php";
$loginUrlPages = $helperPages->getLoginUrl($redirectUrlPages, $permissions);
echo '<a href="' . $loginUrlPages . '">Get pages with Facebook!</a>';
如果我使用上面的代码(评论不相关的部分)只有 一个 facebook 对象来检索个人资料或用户管理的页面(但不是两者) ,一切正常。但是,如果我同时使用 both 个对象来为用户提供选择,我会得到 FacebookSDKException
。我想这是由于 CRSF cookies 造成的。
有什么办法可以避免这个问题吗?
I guess this is due to CRSF cookies.
正确。调用 getLoginUrl
方法会创建一个新的随机 state
值并将其写入会话,覆盖之前存储的任何值。
因此,如果您两次(或更多次)调用该方法,则只有您通过最后一次创建的登录 URL 调用登录对话框时,登录才会起作用,因为只有它包含与该登录相匹配的状态值存储在会话中。
如果您想继续使用两个不同的重定向 URI,那么您需要执行一个额外的步骤来创建正确的登录 URL,并且 仅 那个。
因此您的页面中有两个链接,都指向您服务器上的脚本,并通过 GET 参数传递要请求的权限(无论您是想直接传递权限名称,还是只是像 ?loginmode=1
/?loginmode=2
,由你决定。)
在该脚本中,您决定使用哪个重定向 URI 和范围值来调用 getLoginUrl 方法 - once。然后你的脚本只是重定向到那个登录 URL.
(但请记住,为访问令牌交换代码的步骤也需要传递重定向 URI 参数,一次又一次地使用 exact 相同的值用于登录对话框调用。)
所以按照@luschn 在评论中建议的方式进行操作,使用 JS SDK 进行登录,可能会容易得多。 FB.login
可以从客户端 JS 代码中的不同点以不同的范围调用而不会出现任何此类问题。