目標: Facebookを使用して、実行中の保護されたWebサービスへのアクセスを必要とするiOSアプリケーションへの認証をユーザーに許可します。
前提条件: サインインにFacebookを使用しないことを選択したユーザー向けに、ネイティブ認証(および登録)システムが用意されています。
詳細:
- ユーザーがシステム用に個別のアカウント/資格情報を作成せずにFacebookにサインインするオプションを提供したいとします。
- 私たちは独自のネイティブ認証メカニズム(ユーザー名とパスワード)をサポートしているため、独自のユーザーIDを持ち、最初の資格情報の検証後のやり取りに使用される認証トークンを発行します。
Facebookの開発者向けドキュメントに、これに関するベストプラクティスがないことに驚いています。既存のドキュメントはすべて、FB認証をWebサイトに構築すること、または認証を必要とするサービスのないスタンドアロンのモバイルアプリを想定しています。
これがどのように設計されるかについての最初の考えは次のとおりですが、それが正しいかどうかの検証が必要です。
- クライアントがFacebook iOSログインをポップします
- UIユーザーはFacebook認証情報でサインインし、アクセストークンを取得します
- iOSアプリがアクセストークンをサーバーに渡す
サーバーは、アクセストークンを使用してFBグラフAPIと通信し、(a)トークンを検証し、(b)そのアクセストークンのFBユーザーIDを取得します。
たとえば、サーバーはhttps://graph.facebook.com/me/?access_token=XYZを呼び出し、JSONオブジェクトでプロファイル情報を返します。
有効であると想定すると、サーバーはJSONオブジェクトからユーザーIDを抽出し、ユーザーがすでにアカウントを持っているかどうかを確認します。その場合は、そのセッションで使用するためにクライアントに独自の認証チケットを発行します。ユーザーがアカウントを持っていない場合は、FacebookユーザーIDで新しいアカウントを作成し、独自の一意のユーザーIDを割り当てて、認証チケットを発行します。
- 次に、クライアントは、認証を必要とする後続の対話で認証チケットを返します。
これは私にとっては正しいアプローチのようですが、めちゃくちゃ基本的なものを見逃していて、間違った(複雑な)パスをたどっているかどうかはわかりません。