如何为 Facebook Opengraph javascript SDK api 请求使用访问令牌?
How do I use access token for the Facebook Opengraph javascript SDK api requests?
这是我第一次尝试使用 Facebook API。我正在建立一个网站,上面有一个评级和参考页面,我想在其中包含 FB 评级。
首先关于程序,我不确定我是否应该为此构建一个 Facebook 应用程序并使用应用程序令牌访问,或者我是否可以使用用户或页面访问令牌。我可以在不公开访问令牌或应用程序 ID 的情况下执行此操作吗?
在 "Graph Api Explorer" 中测试不同的用户令牌似乎允许以所有三种方式响应评级。那么为什么我需要一个应用程序?
function facebookLoad () {
window.fbAsyncInit = function() {
FB.init({
appId : 'xxxxxxxxxxxxxxxx',
xfbml : true,
version : 'v2.5'
});
FB.api(
'/website.com',
'GET',
{"fields":"ratings"},
function(response) {
// Insert your code here
console.log(response);
}
);
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = '//connect.facebook.net/en_US/sdk.js';
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
}
就我收到响应对象而言,该脚本目前有效。然而,该对象是一个错误对象,带有以下消息:
...
message: "An access token is required to request this resource."
type: "OAuthException"
....
很明显我需要使用访问令牌,但是哪一个?如何?我只想从响应中提取评分,这样我就可以将它们放在网页上。
更新:
感谢大家的评论,让我朝着正确的方向前进(我认为)。我意识到我已经收到了反对票,但我想我还是会更新,因为我在其他地方还没有找到真正好的答案。
function facebookLoad () {
window.fbAsyncInit = function() {
FB.init({
appId : 'xxxxxxxxxxxxxxxx',
xfbml : true,
cookie : true,
version : 'v2.5'
});
FB.getLoginStatus(function(response) {
if (response.authResponse){
console.log('Welcome! Fetching your information.... ');
FB.api('/me/accounts',
function(response){
var p_accessToken = response.data[0].access_token;
var p_name = response.data[0].name;
FB.api(
'/me?access_token='+p_accessToken+'',
'GET',
{"fields":"about,ratings"},
function(response)
{
/* console.log(JSON.stringify(response)); */
console.log(response);
}
);
});
} else {
console.log('User cancelled login or did not fully authorize.');
}
});
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = '//connect.facebook.net/en_US/sdk.js';
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
}
使用上面更新的代码,我现在可以使用临时页面令牌检索具有评级的数据对象,并在使用临时登录按钮后使用 getLoginStatus 进行调用
<div class="fb-login-button" data-max-rows="1" data-size="medium" data-show-faces="false" data-auto-logout-link="false"
data-scope="manage_pages,publish_pages"
></div>
使用 manage_pages
和 publish_pages
权限登录管理员,方法是将它们添加到数据范围。
尽管如此,我仍在为这个过程而苦苦挣扎。为了让 getLoginStatus 成功执行,我需要页面访问令牌是永久的,这样我就可以再次从网站上删除登录按钮。
目前每次重置 cookie 时我都需要登录,这对于测试来说没问题,但对于生产来说就不行了。阅读文档部分 Extending Page Access Tokens 似乎可以获得永久令牌。
那么,在没有服务器端应用程序的情况下,如何在客户端安全地将临时令牌交换为永久令牌?
我想我应该能够以某种方式做到这一点,手动使用临时用户令牌一次。
最后,在弄清楚我需要的是页面访问令牌后,我放弃了尝试做这个客户端,意识到服务器端更有意义,至少在安全方面是明智的。
<?php
define('FACEBOOK_SDK_V4_SRC_DIR', __DIR__ .'/../src/Facebook/');
require_once __DIR__ .'/../src/Facebook/autoload.php';
$fb = new Facebook\Facebook([
'app_id' => 'app_id_string',
'app_secret' => 'app_secret_string',
'default_access_token' => 'page_access_token_string',
'default_graph_version' => 'v2.5',
]);
$response = $fb->get('/me?fields=ratings');
var_dump($response);
?>
我只是使用 Graph Api Explorer 永久扩展令牌。
我发现 this 文档中关于批处理请求的部分内容特别有用。
就个人而言,我不敢相信我不得不花 4 天时间思考这个问题。老实说,我真的不喜欢 facebook 的文档,但是,可能是我太蠢了。
这是我第一次尝试使用 Facebook API。我正在建立一个网站,上面有一个评级和参考页面,我想在其中包含 FB 评级。
首先关于程序,我不确定我是否应该为此构建一个 Facebook 应用程序并使用应用程序令牌访问,或者我是否可以使用用户或页面访问令牌。我可以在不公开访问令牌或应用程序 ID 的情况下执行此操作吗?
在 "Graph Api Explorer" 中测试不同的用户令牌似乎允许以所有三种方式响应评级。那么为什么我需要一个应用程序?
function facebookLoad () {
window.fbAsyncInit = function() {
FB.init({
appId : 'xxxxxxxxxxxxxxxx',
xfbml : true,
version : 'v2.5'
});
FB.api(
'/website.com',
'GET',
{"fields":"ratings"},
function(response) {
// Insert your code here
console.log(response);
}
);
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = '//connect.facebook.net/en_US/sdk.js';
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
}
就我收到响应对象而言,该脚本目前有效。然而,该对象是一个错误对象,带有以下消息:
...
message: "An access token is required to request this resource."
type: "OAuthException"
....
很明显我需要使用访问令牌,但是哪一个?如何?我只想从响应中提取评分,这样我就可以将它们放在网页上。
更新:
感谢大家的评论,让我朝着正确的方向前进(我认为)。我意识到我已经收到了反对票,但我想我还是会更新,因为我在其他地方还没有找到真正好的答案。
function facebookLoad () {
window.fbAsyncInit = function() {
FB.init({
appId : 'xxxxxxxxxxxxxxxx',
xfbml : true,
cookie : true,
version : 'v2.5'
});
FB.getLoginStatus(function(response) {
if (response.authResponse){
console.log('Welcome! Fetching your information.... ');
FB.api('/me/accounts',
function(response){
var p_accessToken = response.data[0].access_token;
var p_name = response.data[0].name;
FB.api(
'/me?access_token='+p_accessToken+'',
'GET',
{"fields":"about,ratings"},
function(response)
{
/* console.log(JSON.stringify(response)); */
console.log(response);
}
);
});
} else {
console.log('User cancelled login or did not fully authorize.');
}
});
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = '//connect.facebook.net/en_US/sdk.js';
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
}
使用上面更新的代码,我现在可以使用临时页面令牌检索具有评级的数据对象,并在使用临时登录按钮后使用 getLoginStatus 进行调用
<div class="fb-login-button" data-max-rows="1" data-size="medium" data-show-faces="false" data-auto-logout-link="false"
data-scope="manage_pages,publish_pages"
></div>
使用 manage_pages
和 publish_pages
权限登录管理员,方法是将它们添加到数据范围。
尽管如此,我仍在为这个过程而苦苦挣扎。为了让 getLoginStatus 成功执行,我需要页面访问令牌是永久的,这样我就可以再次从网站上删除登录按钮。
目前每次重置 cookie 时我都需要登录,这对于测试来说没问题,但对于生产来说就不行了。阅读文档部分 Extending Page Access Tokens 似乎可以获得永久令牌。
那么,在没有服务器端应用程序的情况下,如何在客户端安全地将临时令牌交换为永久令牌?
我想我应该能够以某种方式做到这一点,手动使用临时用户令牌一次。
最后,在弄清楚我需要的是页面访问令牌后,我放弃了尝试做这个客户端,意识到服务器端更有意义,至少在安全方面是明智的。
<?php
define('FACEBOOK_SDK_V4_SRC_DIR', __DIR__ .'/../src/Facebook/');
require_once __DIR__ .'/../src/Facebook/autoload.php';
$fb = new Facebook\Facebook([
'app_id' => 'app_id_string',
'app_secret' => 'app_secret_string',
'default_access_token' => 'page_access_token_string',
'default_graph_version' => 'v2.5',
]);
$response = $fb->get('/me?fields=ratings');
var_dump($response);
?>
我只是使用 Graph Api Explorer 永久扩展令牌。
我发现 this 文档中关于批处理请求的部分内容特别有用。
就个人而言,我不敢相信我不得不花 4 天时间思考这个问题。老实说,我真的不喜欢 facebook 的文档,但是,可能是我太蠢了。