次のアーキテクチャが必要です (この例の製品名を作成しました)。
1 つのサーバーで実行される Web API 2 アプリケーション http://api.prettypictures.com
別のサーバーで実行されている MVC 5 クライアント アプリ http://www.webpics.com
www.webpics.comクライアント アプリで次の目的で Pretty Pictures API を使用したいと考えています。
- ユーザー名とパスワードで新しいアカウントを登録する
- Facebook/Google/Twitter/Microsoft に新しいアカウントを登録する
- ログイン
- 写真を取得する
Facebook、Googleなどに外部アカウントを登録することを除いて、上記のすべてが機能します。
API の別のクライアント ユーザーから外部アカウントを作成する正しいフローがわかりません。
次のように、認証フローで利用可能なほとんどのドキュメントを調査しました。
OWIN の新しい ID モデルについて、できることはほとんどすべて読みました。
私は Visual Studio 2013 で SPA テンプレートを調べました。これは、クライアントと API が同じホスト上にある場合にのみ、必要なことのほとんどを実行する方法を示しています。複数のクライアントが自分の API にアクセスし、ユーザーが Google などを介してサインアップできるようにしたい場合、それは機能せず、OWIN 認証フローが壊れていることがわかります。
ここまでの流れは次のとおりです。
- ユーザーがwww.webpics.com/Loginにアクセスします
- www.webpics.comはapi.prettypictures.com/Account/ExternalLoginsを呼び出し( www.webpics.comのコールバックに戻るようにreturnUrlを設定)、結果のリンクをユーザーに表示します。
- ユーザーが「Google」をクリック
- ブラウザーは、プロバイダーの名前などでapi.prettypictures.com/Account/ExternalLoginにリダイレクトします。
- API のExternalLoginアクションは、 google.comへのチャレンジをインスタンス化します
- ブラウザはgoogle.comにリダイレクトされます
- ユーザーはユーザー名とパスワードを入力します (まだgoogle.comにログインしていない場合) 。
- google.comは現在、セキュリティ クリアランスを提示しています。「api.prettypictures.com」は、あなたのメール アドレス、名前、妻、子供などへのアクセスを求めています。これでよろしいですか?
- ユーザーが「はい」をクリックすると、Google が設定した Cookie を使用してapi.prettypictures.com/Account/ExternalLoginに戻ります。
これは私が立ち往生したところです。次に起こることは、ユーザーがgoogle.comで正常に認証されたことをクライアント アプリに何らかの方法で通知し、後でアクセス トークンと交換するための 1 回限りのアクセス コードを与えることです。クライアント アプリには、必要に応じて、 google.comログインに関連付けるユーザー名をユーザーに求める機会が必要です。
これを容易にする方法がわかりません。
実際、この時点でブラウザは、Google からのコールバックの後、 api.prettypictures.com/Account/ExternalLoginエンドポイントに留まっています。API は Google にサインインしていますが、クライアントはその処理方法を知りません。その Cookie をwww.webpics.comに送り返す必要がありますか?
SPA アプリでは、AJAX を介して行われ、google.comはトークンを URL フラグメントとして返します。すべてが 1 つのドメインにあるため、すべてうまく機能します。しかし、それは、複数のクライアントが完全に使用できる「API」を持つという点の多くに反しています。
ヘルプ!