Visual Studio 2015 テンプレート/WebAPI 2 の最新のボイラー プレート コードについていくつかのメモを書き留めておこうと思いました。Google 認証でこの問題が発生していましたが、Facebook やその他のソーシャル ログインに似ていると考えました。私は最新の Owin を持っていて、他の nuget パッケージは最新でした。最新のすぐに使える web api 2 テンプレートが判明しました。「メール」を Google から返すように具体的に要求する必要がありました。この行がないと、api/Account/Register の呼び出しでエラーが発生します。
そしてもちろん、アプリが Google に登録されていることと、サイトがアプリを呼び出すことが許可されていることを確認してください。(これらの手順を示す良い例がたくさんあります。)
https://console.developers.google.com/apis
App_Start\Startup.Auth.cs ファイルでの私の調整は次のとおりです。
var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
ClientId = "xxx",
ClientSecret = "xxx"
};
googleOptions.Scope.Add("email"); //!! Add this !!
app.UseGoogleAuthentication(googleOptions);
.Add("email"), 行を追加するまで、api/Account/RegisterExternal WebAPI 2 呼び出し (AccountController.cs) は、RegisterExternal のこのセクションから null を返します。
var info = await Authentication.GetExternalLoginInfoAsync();
if (info == null) //This would be true, and it would error.
{
return InternalServerError();
}
これは、このエラーについて出てくる数少ない記事の 1 つであるため、後世のために解決策に関するメモにタグを付けることにしました。(特に、郵便配達員のテスト プロセス!)
したがって、テストですべてを機能させるには: 1) api/Account/ExternalLogins URL を次のように呼び出します。
http://localhost:59137/api/Account/ExternalLogins?returnUrl=%2F&generateState=true
次のような応答が得られるはずです。
<ArrayOfExternalLoginViewModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TCG_DL_API.Models">
<ExternalLoginViewModel>
<Name>Google</Name>
<State>1phegLF241xeSfd8gZAsCXiBAp3l5bMygg2VSeRXAHk1</State>
<Url>
/api/Account/ExternalLogin?provider=Google&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A59137%2F&state=1phegLF241xeSfd8gZAsCXiBAp3l5bMygg2VSeRXAHk1
</Url>
</ExternalLoginViewModel>
</ArrayOfExternalLoginViewModel>
2) 次に、応答から URL を取得し、それを呼び出します。Google ログイン プロンプト/ページが表示されます。(または、あなたが設定したものであれば、facebook や twitter を想定しています。)
3) ログインすると、リダイレクト ページにリダイレクトされます。次のような URL になります。
http://localhost:59137/#access_token= d5asC1arCUXaLEMgBS8PT_uwZcTJqC1UZbXblNZ3hMOh3TSKtEXYeKtyKBTv3WmLcaLGGomSvpRSFMfXPxpPvNRgjUVWAiqxtKfv3qWHNqfIMeu5j0eZrJDRAMTrYFgflSbEopAe909a31I4mQnJuvaiITHYPrLmqkm6J88HAVx8F981_q_tflu4A72k3KaB-m2wd0-p1jdQnNMlixM2Wfloh_niUTBIOYUPc1SkKWcZxuI6dzN2Z0PmWHDwzJI8nM8vOuzybJIsxLOyTY1VfzSQ5Qzcll3HhifLPkyZxvXDQ5LHqW1v0_AztsUWkEhW_AJzmw2IaOcTtHCmkmWm1K444okNtOsYfs6HFui0NeY&token_type =bearer&expires_in=1209600&state=3FSOd3_n_sEL4QtiELWPG5B2_H3wRjVb75uDjQS16gk1
トークン (上記の太字) を取得し、それをベアラー トークンとして使用します。
4) 登録されていないので (ベアラー トークンは持っています)、POST api/Account/RegisterExternal を呼び出すことができます。
5) 応答は OK です。AspnetUser テーブルを見ると、プロバイダとして Google の新しい AspnetUsers レコードと新しい AspNetUserLogins レコードがあることがわかります。
これが、このようなものを機能させようとしている人に役立つことを願っています!