ユーザーは、ブラウザーを更新せずに私の Facebook アプリを何時間も使用したいと考えています。
ただし、トークンは 2 時間で期限切れになります。現在、ユーザーにページを更新するように依頼していますが、それは面倒です。
一部のユーザーを怖がらせるため、オフライン アクセスの許可を求めたくありません。
最善の解決策は、何らかの方法で「再ログイン」し、ページを更新せずに新しいトークンを取得することです。出来ますか?
ユーザーは、ブラウザーを更新せずに私の Facebook アプリを何時間も使用したいと考えています。
ただし、トークンは 2 時間で期限切れになります。現在、ユーザーにページを更新するように依頼していますが、それは面倒です。
一部のユーザーを怖がらせるため、オフライン アクセスの許可を求めたくありません。
最善の解決策は、何らかの方法で「再ログイン」し、ページを更新せずに新しいトークンを取得することです。出来ますか?
有効期限トリガーをサブスクライブし (これは authResponseChange だと思います)、別のログイン チェックを自動化します。多くのブラウザがブロックする可能性があるポップアップを自動的にトリガーする可能性があるため(たとえば、ログアウトした場合)、完全なソリューションにはなりません。代わりに、トークンの有効期限が切れたときに、ポップアップを完了する必要があるかどうかを確認し、「Facebook を続行するには注意が必要です」という通知をページのどこかに表示し、応答からポップアップのみを起動することができます。ブロックされているポップアップを停止します。
FB.Event.subscribe('auth.authResponseChange', function(response) {
// do something with response
FB.login(){
// refresh their session - or use JS to display a notification they can
// click to prevent pop up issues
}
});
これをワークアウトするアルゴリズム
offline_access権限でトークンを取得してみてください。
私は、これは不可能だと思います.FBアーキテクチャはそれを許可しません. そして、なぜoffline_accessがそのような問題なのか!!!!!!... とにかく、offline_accessは私が推測する最良の最適なソリューションです....
ajax の使用を考えたことはありますか? 2 時間後、ユーザーがまだアクティブかどうかを確認します。その場合、axax リクエストを URL に送信すると、セッションの詳細が更新されます。例:
$(document).ready(function(){
setInterval('update_session()', 5500000);
})
update_session(){
$.post({
URL: ..., // script to update session on server
data:{ /* username, password */ },
})
}
サーバー側は、投稿からユーザー名とパスワードを取得するか、再ログインを実行します。
残念ながら、これは設計上不可能であると考えています (ユーザーの介入なしに発生することを意味している場合)。ユーザーがまだ Facebook にログインしている場合、トップレベルのページを Facebook にリダイレクトすることができ、新しいコードですぐに戻ってきます (すでに行っているように思えます)。確認できるクッキー。サーバーから何かをしようとすると、その Cookie がリクエストに付随しないため、拒否されます。JavaScript から facebook への呼び出しを試みる場合も同様です。コードが別のドメインで実行されているため、Cookie は呼び出しに付随せず、Facebook はそれを拒否します。Facebook がユーザーが誰で、まだログインしているかを知る唯一の方法は、その Cookie を確認することです。
また、Facebook が唯一の論理的な回避策、つまり oauth URL を iframe にロードすることをブロックしたことにも言及する価値があります。試してみると、ページが iframe に読み込まれていることを検出し、トップレベルのリダイレクトを行ってフレームから抜け出すリンクを含むページを出力することがわかります。したがって、このアプローチが機能しないだけでなく、Facebook がアーキテクチャの一部として特に不可能にしたことは明らかです。
編集: 更新を完全に回避するのではなく、新しいトークンが必要なときに自動的に更新することを意図している場合は、次のようにすることができます。
$status=0;
$data=@file_get_contents("https://graph.facebook.com/me?access_token=$token");
foreach ($http_response_header as $rh) if (substr($rh, 0, 4)=='HTTP') list(,$status,)=explode(' ', $rh, 3);
if ($status==200)
{
//token is good, proceed
}
else
{
//token is expired, get new one
$fburl="http://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=".urlencode('http://apps.facebook.com/yourapp/thispage.php');
echo "<html>\n<body>\n<script>top.location='$fburl';</script>\n</body>\n</html>\n";
exit;
}
これは、このコードの前に、signed_request パラメーターが存在する場合はそれを処理し、値を $token (独自の明示的なコードまたは適切な SDK エントリ) に割り当てる何かがあることを前提としています。表示されたコードは、続行する前に $token がまだ有効かどうかを確認する必要がある場所で使用できます。
iframesigned_request
パラメータを使用してアクセス トークンを取得していると思います。必要なものを実現する 1 つの方法は、アクセス トークンを取得する oAuth 2.0 メソッドを使用することです。これは、最初の例ではより長くなります。サーバーと Facebook は資格情報を交換する必要があり、これは遅くなる可能性がありますが、アクセス トークンと定期的に交換できる が与えられることを意味します。これはcode
、サーバーが定期的にセッションを維持できることを意味します (おそらくクライアントからの ajax 呼び出しから)。 . 次に、この新しい access_token をクライアントに渡し、リクエスト (ギフト) のダイアログ呼び出しで使用します。
それが役立つことを願っています。
スパビー
https://developers.facebook.com/docs/offline-access-deprecation/#extend_tokenをご覧ください
基本的に、トークンを拡張します
https://graph.facebook.com/oauth/access_token?
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN
これにより、新しい有効期限のある新しいトークンが得られます(60dである必要がありますが、ここで説明されているような同様のバグに気づいています https://developers.facebook.com/bugs/347831145255847/?browse=search_4f5b6e51b18170786854060)