デスクトップWebサイトとネイティブiOSアプリケーションの両方を備えた製品に取り組んでいます。両方のコンテキストで、ユーザーのログインオプションとしてFacebook接続を提供しています。
私の意図は、両方のコンテキストで使用するために安全なJSON APIを介して同じFacebookトークンを共有することでした。ユーザーがWebにサインインすると、トークンはバックエンドに保存され、モバイルクライアントが次に実行されたときにトークンをダウンロードできるようになります。そしてそれも使用し、その逆も同様です。(*このアプローチの詳細な理由は、質問の最後に説明しますが、質問に不可欠ではありません。)
問題:iOSクライアントがトークンを使用してフィードダイアログを事前設定する場合、そのトークンがサーバー側のフローを使用してWebによって生成されると、ダイアログのWebビューでエラーが発生します。
「{myappname}でエラーが発生しました。しばらくしてからもう一度お試しください。」
これは確実に再現可能です。
- サーバー側のフローを使用して、新しいアクセストークンを生成します。フィードダイアログを使用するため、必ずpublish_actions権限をリクエストしてください。
- インコグニートブラウザウィンドウを使用して(空のCookie jarを取得するため)、iOSフィードダイアログがWebビューに表示するm.facebook.comページを表示します:https ://m.facebook.com/dialog/feed?access_token = SERVER_SIDE_FLOW_ACCESS_TOKEN&app_id = YOUR_APP_ID&redirect_uri = fbconnect%3A%2F%2Fsuccess&sdk = 2&display = touch
#2の代わりに、Facebook SDKを使用してダミーのiOSアプリを作成し、それを正しくインスタンス化してダイアログを表示するすべての作業(私はすでに行っています)を行うことができます。エラーを再現するために、m.facebook.comフィードのURLに直接アクセスする方が簡単です。
トークンがサーバー側の認証フローではなく、ネイティブのFacebook iOS SDKによって開始された認証フローによって生成された場合、上記のフィードURLは期待どおりに完全に機能します。
さらに、トークン(モバイルまたはサーバーで生成)は、グラフAPIを介してフィードアイテムを直接投稿するために完全に正常に機能します。問題は、実際にはモバイルフィードダイアログだけにあります。
Facebookは、サーバー側で生成されたトークンがモバイルフィードダイアログコンテキストで動作することを意図的に禁止していますか?
これはm.facebook.comのフィードダイアログエンドポイントのバグですか?
または、うまくいけば、私は何か間違ったことをしていますか?
トークンを共有したいのはなぜですか?
- offline_access権限が削除されているため、各クライアント(Webとモバイル)は、ユーザーがアクティブなときに他のクライアントに同じトークンを更新させることでメリットを得ることができます。これにより、トークンの有効期限が切れるインスタンスが少なくなるため、ユーザーが最初から再認証する必要があるケースが少なくなります。
- 同様に、各クライアントは他のクライアントの権限拡張の恩恵を受けることができるため、ユーザーは追加の権限を承認するように頻繁に求められることはありません。