目標:実行中の保護された Web サービスへのアクセスを必要とする iOS アプリケーションで、ユーザーが Facebook を使用して認証できるようにします。
前提:サインインに Facebook を使用しないことを選択したユーザー向けに、ネイティブの認証 (および登録) システムが用意されています。
詳細:
- システム用に別のアカウント/認証情報を作成せずに、ユーザーが Facebook でサインインできるオプションを提供したいとします。
- 当社では独自のネイティブ認証メカニズム (ユーザー名とパスワード) をサポートしているため、独自のユーザー ID を持ち、最初の資格情報の検証後の後続のやり取りに使用される認証トークンを発行します。
Facebook の開発者向けドキュメントに、このことに関するベスト プラクティスが記載されていないことに驚きました。既存のドキュメントはすべて、Web サイトに FB 認証を組み込むか、認証を必要とするサービスのないスタンドアロンのモバイル アプリを組み込むことを前提としています。
これがどのように設計されるかについての私の最初の考えはここにありますが、それが正しいかどうかの検証を希望します。
- クライアントがFacebook iOSログインをポップアップする
- UI ユーザーは Facebook の認証情報でサインインし、アクセス トークンを取得します。
- iOSアプリがアクセストークンをサーバーに渡す
当社のサーバーは、アクセス トークンを使用して FB グラフ API と通信し、(a) トークンを検証し、(b) そのアクセス トークンの FB ユーザー ID を取得します。
例えば、サーバーはhttps://graph.facebook.com/me/?access_token=XYZJSONオブジェクトでプロフィール情報を返します
有効であると仮定すると、サーバーは JSON オブジェクトからユーザー ID を抽出し、ユーザーがすでにアカウントを持っているかどうかを確認します。アカウントを持っている場合は、そのセッションで使用するために独自の認証チケットをクライアントに発行します。ユーザーがアカウントを持っていない場合は、Facebook ユーザー ID を使用して新しいアカウントを作成し、独自の一意のユーザー ID を割り当てて、認証チケットを発行します。
- その後、クライアントは認証が必要な後続のやり取りで認証チケットを返します。
これは私にとっては正しいアプローチのように思えますが、何か非常に基本的なことを見逃して間違った(複雑な)道を進んでいるのかどうかはわかりません。
ベストアンサー1
私自身もこれに対処しましたが、私を悩ませた部分は次のとおりです。
ステップ 5 では、ユーザーが Facebook ID とはまったく別のアカウントを登録することは可能ですか? その後、別の機会にユーザーが Facebook でログインすると、2 つ目のアカウントが作成され、最初のアカウントが失われます。
Web サービスにログインし、次に Facebook にログインして、Facebook ID とローカル アカウント間の関連付けを取得する方法が必要です。
それを除けば、あなたの計画はしっかりしているようです。
更新:Facebookはそのようなシナリオを概説した文書を追加しましたここ