14

私のプロジェクトはNode.jsとExpressを使用していますが、問題は一般的なアプローチに関するものです。

私たちのユーザーはすべてFBの出身であり、FB以外の認証はありません。一部のアクションを特定のFBユーザーに関連付ける必要があり、FBと通信するためのトークンも必要です。

現在、私たちはそのようにしています:

  • ユーザーがページにアクセスします
  • 目に見えないブロックがあります。1つはユーザーのアバターと名前のプレースホルダー(「ログイン」)、もう1つはFBログインをトリガーするボタン(「ログアウト」)です。
  • FB JS SDKを使用して、ユーザーのログインステータスを確認します。接続されている場合(実際には、FBにログインし、アプリを認証し、必要なすべての権限を提供します)、ユーザーの名前とFB IDを取得し、「ログイン」ブロックを表示します。それ以外の場合は、「ログアウト」ブロックが表示されます
  • 一部のアクションでログインしたユーザーの場合、ユーザーのaccess_tokenはAJAX(心配なし、ここではHTTPS)を介してサーバーに渡され、ユーザーの壁への投稿などのアクションのためにサーバーコードによって使用されます。
  • FBログインボタンはJSによって処理され、FB.login()を呼び出します
  • JS authResponseChangedイベントで、明らかなアクションが実行されます(ログイン/ログアウトブロックの表示/非表示)

良い点:ユーザーのステータスが有効であることは常にわかっています(トークンのTTLは通常のページの有効期間よりも長いため、ここでは問題ありません)。

私たちがあまり好きではないこと:*クライアント側のトークンは短命です(はい、交換できますが、代替手段が見つかった場合は交換したくありません)*通常はFBにいくつかのリクエストが必要です(1-ロードJS SDK、2-何かを表示できるようになるまでログインステータスを取得します。私たちのサイトの「ログイン」ブロックが空になるまで。

質問はなんですか?

ここでサーバー側のコードを使用し、少なくともユーザーがログインしていることが確実なときにユーザーの名前とアバターをレンダリングする最適な方法を探しています。

私はこのようないくつかのスキームを想像することができます:

  • サーバー側の認証(リダイレクトあり)を使用して、存続期間の長いトークンを取得し、サーバーに保持します
  • セッションでユーザーのステータス(ログイン/ログアウト、FB ID、名前)を保存します
  • セッションにログイン状態がある場合は、サーバーでテンプレートを処理するときに名前とアバターをレンダリングします

懸念事項

  • ユーザーがFBからログに記録した場合、またはアプリの権限を取り消した場合、それをどのように知る必要があり、いつチェックする必要がありますか(Nリクエストごとにチェックしますか?X時間ごとにチェックしますか?トークンがY時間で期限切れになるときにのみチェックしますか?)
  • 代わりに、テンプレートをレンダリングする前にサーバーからユーザーのステータスを確認すると(公式の例の場合)、速度が低下しますよね?原因FBAPI呼び出しは、暑い時間帯にはかなり遅くなる可能性があると思います。
4

2 に答える 2

6

JS SDKを使用することは、ユーザーのステータスを「リアルタイム」で知るための唯一の実行可能な方法です。(FB.getLoginStatusの結果もキャッシュされるため、引用符で囲まれた「リアルタイム」–常に正確にしたい場合は、trueに設定された2番目のパラメーターを使用する必要があります。)

ドメインにCookieを設定するようにJSSDKを設定している場合、PHP SDKは、HTTPを介したAPIルックアップなしでユーザーのログインステータスを判断できます。CookieからユーザーIDを読み取るだけなので、Facebook :: getUser ()はユーザーIDを取得します。画像を表示するにはこれで十分ですが、ユーザー名については、APIリクエストが必要です。

ここでは、名前を一度要求してから、それをセッションに保存することを選択できます。次のリクエストで、JS SDKがユーザーが接続されていないことを示した場合は、ページからログイン情報を消去するか、リロードを強制する(そして、セッションをクリアする)ことで、ログイン状態。

于 2012-11-13T10:28:08.540 に答える
0

実際、「リアルタイムであるためには、JS SDKを使用する必要がある」と言うのはまったく間違っています!Facebookには「RealtimeUpdatesGraphAPI」があり、一部のデータが更新されるたびに、ローカルデータベースが自動的に更新されるため、JSSDKを使用する必要はありません。

于 2012-11-16T09:34:19.670 に答える