グーグルとStackOverflowを見回して、誰もが実際に行うべき同じアドバイスを持っています:
FB.login(function(response) {
if (response.authResponse) {
var accessToken = response.authResponse.accessToken;
}
});
ページに「共有」ボタンがあります。クリックすると、ユーザーのプロファイルに投稿し、https://graph.facebook.com/me/feed呼び出しを使用して投稿します。それを行うには、Facebookのaccess_tokenが必要なので、次のようにしました。
(FB.init()を呼び出し、all.jsを追加した後)
FB.login(function (response) {
console.log('response.authResponse: ' + response.authResponse);
if (response.authResponse) {
var access_token = FB.getAuthResponse()['accessToken'];
console.log('Access Token = ' + access_token);
FB.api('/me', function (response) {
console.log('Good to see you, ' + response.name + '.');
});
} else {
console.log('User cancelled login or did not fully authorize.');
}
}, { scope: 'user_about_me' });
私が期待していることは、ユーザーがFacebookにログインするためのログインダイアログを開き、ユーザーがログインするとダイアログが閉じて、私のページに戻り、アクセストークンを取得することです。
しかし、何が起こるかというと、ログインダイアログでFacebookに新しいブラウザウィンドウが生成されます。ユーザーがログインすると、ページはユーザーのニュースフィードページに進み、上記のコールバックは呼び出されません。したがって、基本的に、コントロールはなくなり、ユーザーの通常のFacebookブラウジングとして新しいブラウザウィンドウに転送されます。ただし、その新しいウィンドウを閉じると、ログに対して「ユーザーがログインをキャンセルしました」が実行されます。
ここで何が欠けていますか?すべてのリソースは単にFB.loginを呼び出すことを提案しており、それは私がすでに行っていることですが、ユーザーのアクセストークンを取得できないようです。
前もって感謝します!
編集:完全なコードとより多くのコメント
<script type="text/javascript" language="javascript">
window.fbAsyncInit = function ()
{
FB.init(
{
appId: '<%= this.ApplicationId %>', // App ID
channelURL: '<%= this.ChannelFileUrl %>', // Channel File
status: true, // check login status
cookie: true, // enable cookies to allow the server to access the session
oauth: true, // enable OAuth 2.0
xfbml: true // parse XFBML
});
// Additional initialization code here
};
// Load the SDK Asynchronously
(function (d)
{
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) { return; }
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/<%= this.LocaleCode %>/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
} (document));
</script>
次に、この関数を呼び出すいくつかのjsファイルで(実際に投稿していないため、パラメーターはまだ使用されていません)
function postToFacebook(name, caption, description, link, picture, id) {
var accessToken = "";
console.log('fb event subscribe');
FB.Event.subscribe('auth.login', function () {
console.log('facebook event auth.login');
});
console.log('fb login');
FB.login(function (response) {
console.log('response.authResponse: ' + response.authResponse);
if (response.authResponse) {
var access_token = FB.getAuthResponse()['accessToken'];
console.log('Access Token = ' + access_token);
} else {
console.log('User cancelled login or did not fully authorize.');
}
}, {});
}
何が起こるかのシーケンスは次のとおりです。
- 印刷された「fbイベントサブスクライブ」
- 印刷された「fbログイン」
- コードがFB.loginにヒット->Facebookへの新しいブラウザウィンドウを開きます。ユーザーログイン後、フォーカスはその新しいウィンドウに留まり、FB.loginのコールバック関数には決して入りません。
- 上記の手順3で生成されたウィンドウを閉じると、コールバック関数が呼び出され、「ユーザーがログインをキャンセルしたか、完全に承認しませんでした」。が出力されます('response.authResponse:'はnullを返します)
ステップ1と2が予想されます。ステップ3が問題です。また、開いているウィンドウのURLはhttps://www.facebook.com/home.php?_rdrです。