我创建了一个应用程序与asp.net mvc api与用户,遵循本教程。一切都很顺利。
现在我试图添加外部登录(实际上只是Facebook)。我一直在寻找如何做到这一点,我在这里找到了答案。
所以我有Startup.Auth.cs
配置Facebook AppId/Secret。
我打电话给GET api/Account/ExternalLogins?returnUrl=%2F&generateState=true
然后我重定向到给定的Url。然后返回到http://localhost:49728/#access_token= ... &token_type=bearer&expires_in=2592000&state= ...
这就是我的问题。我下一步该怎么做才能在网站上注册用户
web应用程序完成后,将有一个移动本机应用程序。
编辑
我更改了返回url,以便我可以询问并保存用户名。到目前为止还好。
保存新用户后,我需要进行登录,所以我尝试如下:
var state = new RegExp('[&&]state=([^&#]*)').exec(window.location.href);
$.get(baseurl + 'api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=' + encodeURIComponent(baseurl) + '&state=' + state[1], function (data, status) {
console.log(data);
});
但是我得到了400错误请求。
我现在的问题是我怎么能解决这个问题,并使登录?
您需要将结果访问令牌添加到授权头(使用postman进行测试)中,并使用它来调用RegisterExternal web调用,如下所示:
授权承载访问令牌在这里
在注册外部网络呼叫,你需要提供一个电子邮件,我猜它与facebook登录相关联。
那么你需要再次执行外部登录调用,就像你第一次做的(链接来自get外部登录)
这次返回的访问令牌将是本地访问令牌,而不是facebook外部访问令牌,这个令牌可以用来调用你的asp.net api,通过将它添加到http请求头作为"授权",就像我解释的那样。
编辑:对于您面临的错误请求,请尝试以下操作:转到ApplicationOAuthProvider类,然后到ValidateClientRedirectUri方法,将该方法代码更改为:
if (context.ClientId == _publicClientId)
{
Uri expectedRootUri = new Uri(context.Request.Uri, "/");
if (context.RedirectUri.StartsWith(expectedRootUri.AbsoluteUri))
{
context.Validated();
}
}
return Task.FromResult<object>(null);