我想我会为 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) 像这样调用 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,并调用它。你应该得到谷歌登录提示/页面。(或者我假设是 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) 响应正常,如果您查看 AspnetUser 表,您会看到您有一个新的 AspnetUsers 记录和一个新的 AspNetUserLogins 记录,供 google 作为提供者使用。
我希望这对任何试图让这些东西起作用的人有所帮助!