如何从 Facebook 页面选项卡内部登录用户并在服务器端获取 access_token 到 post 提要的轮播?
How to login user from inside Facebook Page Tab and get access_token on server side to post a carousel to the feed?
我有一个 Page Tab facebook 应用程序。我想从中 post 到用户时间表。
在客户端使用 javascript sdk 登录后(我使用 angularjs 模块 Ciul/angular-facebook(抱歉,不能 post github link 这里)):
https://gist.github.com/Sevavietl/7e363fdfd0e714a12a43
我在服务器端检索 access_token 并尝试 post 轮播到用户提要:
https://gist.github.com/Sevavietl/cec5fa434837312adfd3
我有两个问题:
- 当我第一次打电话时
Graph 返回错误:(#210) Param id 必须是一个页面。
浏览后发现,这可能是token使用错误导致的。不是 user_access_token。但是我在客户端登录用户。
- 下一个电话我接到
图返回错误:此授权码已被使用。
再次浏览后,我发现令牌只能使用一次才能符合 OAuth。
请告诉我如何正确执行此操作?
提前致谢。
此致,
弗谢沃洛德
在这上面花了一些时间之后,我正在写我的解决方案,因为它不是很明显,至少对我来说是这样。但是,实际上,所有信息都在文档中。
从问题编号 2 开始:在接下来的调用中,我得到 Graph 返回错误:已使用此授权码。
正如评论中提到的,我确实混淆了 access_token 和授权码。正如我以真正简化的形式理解的那样,该机制是:
- 当您使用 facebook-javascript-sdk 登录时,它会将
authorization code
写入 cookie。
然后在服务器端,您可以从 facebook-php-sdk 中可用的 javaScriptHelper 检索 access_token
。这个助手有 getAccessToken()
方法,它使用 authorization code
从 cookie 中检索 access_token
。这是我感到困惑的地方。我试图在每个请求上使用 getAccessToken()
。由于请求是用 AJAX 提出的,因此 authorization code
没有改变,而且你只能在我遇到错误时使用它。 网上很多地方都指出了这个问题的解决方案,但不知何故我却误解了这一点。
这是使用会话存储 access_token
的代码摘录,并且只有在会话中未设置 access_token
时才使用 getAccessToken()
方法。
$fb = new Facebook([
'app_id' => $widget->app_id,
'app_secret' => $widget->app_secret,
'default_graph_version' => 'v2.5',
]);
$helper = $fb->getJavaScriptHelper();
if ($request->session()->has('facebook_access_token')) {
$accessToken = $request->session()->get('facebook_access_token');
} else {
$accessToken = $helper->getAccessToken();
// OAuth 2.0 client handler
$oAuth2Client = $fb->getOAuth2Client();
// Exchanges a short-lived access token for a long-lived one
$longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
$request->session()->put('facebook_access_token', (string) $longLivedAccessToken);
$request->session()->save();
}
if ($accessToken) {
$fb->setDefaultAccessToken($accessToken);
} else {
die('No Access Token');
}
我使用 Laravel,因此会话处理与框架无关。这段代码只是举例,创建服务和移动逻辑更好
现在。关于第一个问题:第一次调用时我得到 Graph 返回错误:(#210) Param id must be a page.
我又混淆了两件事'{user-id}/feed'
and '{page-id}/feed'
。我的目标是 post 一个 带有图像和链接的旋转木马 。要创建轮播,您必须在字段数组中提供 child_attachments
。虽然您可以将这样的 Post 发送到 '{page-id}/feed'
,但您不能将 '{user-id}/feed'
发送给 '{user-id}/feed'
。 因此目前您无法 post 轮播用户供稿。
因此,当 Graph Api 获得适用于 '{page-id}/feed'
的 Post 数据时,它假设我已经通过了 {page-id}
。而当获得 {user-id}
时,Graph Api 大喊 "(#210) Param id must be a page.".
我有一个 Page Tab facebook 应用程序。我想从中 post 到用户时间表。
在客户端使用 javascript sdk 登录后(我使用 angularjs 模块 Ciul/angular-facebook(抱歉,不能 post github link 这里)):
https://gist.github.com/Sevavietl/7e363fdfd0e714a12a43
我在服务器端检索 access_token 并尝试 post 轮播到用户提要:
https://gist.github.com/Sevavietl/cec5fa434837312adfd3
我有两个问题:
- 当我第一次打电话时 Graph 返回错误:(#210) Param id 必须是一个页面。
浏览后发现,这可能是token使用错误导致的。不是 user_access_token。但是我在客户端登录用户。
- 下一个电话我接到 图返回错误:此授权码已被使用。
再次浏览后,我发现令牌只能使用一次才能符合 OAuth。
请告诉我如何正确执行此操作?
提前致谢。
此致, 弗谢沃洛德
在这上面花了一些时间之后,我正在写我的解决方案,因为它不是很明显,至少对我来说是这样。但是,实际上,所有信息都在文档中。
从问题编号 2 开始:在接下来的调用中,我得到 Graph 返回错误:已使用此授权码。
正如评论中提到的,我确实混淆了 access_token 和授权码。正如我以真正简化的形式理解的那样,该机制是:
- 当您使用 facebook-javascript-sdk 登录时,它会将
authorization code
写入 cookie。 然后在服务器端,您可以从 facebook-php-sdk 中可用的 javaScriptHelper 检索
access_token
。这个助手有getAccessToken()
方法,它使用authorization code
从 cookie 中检索access_token
。这是我感到困惑的地方。我试图在每个请求上使用getAccessToken()
。由于请求是用 AJAX 提出的,因此authorization code
没有改变,而且你只能在我遇到错误时使用它。 网上很多地方都指出了这个问题的解决方案,但不知何故我却误解了这一点。 这是使用会话存储access_token
的代码摘录,并且只有在会话中未设置access_token
时才使用getAccessToken()
方法。$fb = new Facebook([ 'app_id' => $widget->app_id, 'app_secret' => $widget->app_secret, 'default_graph_version' => 'v2.5', ]); $helper = $fb->getJavaScriptHelper(); if ($request->session()->has('facebook_access_token')) { $accessToken = $request->session()->get('facebook_access_token'); } else { $accessToken = $helper->getAccessToken(); // OAuth 2.0 client handler $oAuth2Client = $fb->getOAuth2Client(); // Exchanges a short-lived access token for a long-lived one $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); $request->session()->put('facebook_access_token', (string) $longLivedAccessToken); $request->session()->save(); } if ($accessToken) { $fb->setDefaultAccessToken($accessToken); } else { die('No Access Token'); }
我使用 Laravel,因此会话处理与框架无关。这段代码只是举例,创建服务和移动逻辑更好
现在。关于第一个问题:第一次调用时我得到 Graph 返回错误:(#210) Param id must be a page.
我又混淆了两件事'{user-id}/feed'
and '{page-id}/feed'
。我的目标是 post 一个 带有图像和链接的旋转木马 。要创建轮播,您必须在字段数组中提供 child_attachments
。虽然您可以将这样的 Post 发送到 '{page-id}/feed'
,但您不能将 '{user-id}/feed'
发送给 '{user-id}/feed'
。 因此目前您无法 post 轮播用户供稿。
因此,当 Graph Api 获得适用于 '{page-id}/feed'
的 Post 数据时,它假设我已经通过了 {page-id}
。而当获得 {user-id}
时,Graph Api 大喊 "(#210) Param id must be a page.".