gpt4 book ai didi

c# - 注册外部登录 Web API

转载 作者:可可西里 更新时间:2023-11-01 08:27:55 28 4
gpt4 key购买 nike

我不明白为什么他们没有明确的教程或指南,所以我希望我的问题能在这里得到解答。

因此,尝试通过 Web Api 从 facebook 或 google 注册用户。

问题是,在 RegisterExternal 方法的这一行:

var info = await Authentication.GetExternalLoginInfoAsync();

它返回 null,因此返回一个 BadRequest()

到目前为止我得到了什么:

Startup.Auth.cs 中,我已经添加了 ID 和 secret ,请注意,我也尝试过使用 Microsoft.Owin.Security.Facebook

var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
{
AppId = "103596246642104",
AppSecret = "1c9c8f696e47bbc661702821c5a8ae75",
Provider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, ClaimValueTypes.String, "Facebook"));

return Task.FromResult(0);
}
},
};
facebookOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookOptions);



app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
ClientId = "328779658984-t9d67rh2nr681bahfusan0m5vuqeck13.apps.googleusercontent.com",
ClientSecret = "ZYcNHxBqH56Y0J2-tYowp9q0",
CallbackPath = new PathString("/api/Account/ManageInfo")
});

facebookOptions 来源:this post

额外的 facebookOptions 并没有解决问题。

我能够从 Google 和 Facebook 检索 access_token。我还可以使用此 access_token 对 api/Account/UserInfo

进行身份验证
GET http://localhost:4856/api/Account/UserInfo
in the header:
Authorization: Bearer R9BTVhI0...

返回:{"Email":"firstname lastname","HasRegistered":false,"LoginProvider":"Facebook"}

我注意到他们的一个问题是,它将我的名字作为电子邮件返回,而不是实际的电子邮件地址。

现在我想为我的数据库注册一个新用户的外部登录,我像这样进行 POST 调用:

POST http://localhost:4856/api/Account/RegisterExternal
[header]
authorization: bearer 6xcJoutY...
Content-Type: application/json
[body]
{"Email":"...@hotmail.com"}

来源:this post

现在这会在 RegisterExternal() 内部的代码片段上返回 BadRequest:

    public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//AuthenticationManger?
var info = await Authentication.GetExternalLoginInfoAsync();
if (info == null)
{
return InternalServerError();
}

在调试中,ExternalLoginConfirmationViewModel 确实包含我的电子邮件地址。

我做错了什么?我是否必须向 Startup.cs 添加内容?在 Startup.Auth.cs 中我还需要做些什么吗?我是否错误地调用了 RegisterExternal?在 MVC 中一切顺利,为什么在 Web API 中不行?

阿苏看着 this answer来自 this question , 但我不明白如何实现这一点。

最佳答案

这种方法不太实用,因为你正在开发一个 API,它很可能用于应用程序,你最好的方法是处理 API 使用者使用 facebook 的登录,并让他们向你发送一个 facebook 身份验证 token .

基本上我正在尝试这样做:

  1. 为 facebook 创建外部登录链接。
  2. 将用户转到该链接,该链接会将他们带到 Facebook 登录页面。
  3. 登录后facebook会重定向到api。
  4. 用户会注册,但使用 API 的应用/网站如何知道?

你想要做的是这样的:

  1. API 消费者创建他们自己的方法来使用 facebook 登录(对于通过 SDK 的应用程序)
  2. API 消费者将向 API 发送一个 facebook token 以注册/登录。
  3. API 将使用 facebook 图形端点检查 token 。
  4. 成功后,API 将返回一个不记名 token ,供 API 发出进一步经过身份验证的请求。

因此,作为 API 开发人员,您将像这样验证 token :

var verifyTokenEndPoint = string.Format("https://graph.facebook.com/debug_token?input_token={0}&access_token={1}", accessToken, appToken);

然后获取userId

var client = new HttpClient();
var uri = new Uri(verifyTokenEndPoint);
var response = await client.GetAsync(uri);

if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();

dynamic jObj = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(content);

string user_id = jObj["data"]["user_id"];
string app_id = jObj["data"]["app_id"];
}

最终您会像这样创建或找到一个用户:

IdentityUser user = await _userManager.FindAsync(new UserLoginInfo(provider, verifiedAccessToken.user_id));

然后如何创建不记名 token 完全取决于您,如果您按照下面列出的教程进行操作,您可以拥有:

var tokenExpiration = TimeSpan.FromMinutes(30);

ClaimsIdentity identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType);

identity.AddClaim(new Claim(ClaimTypes.Name, userName));
identity.AddClaim(new Claim("role", "user"));

var props = new AuthenticationProperties()
{
IssuedUtc = DateTime.UtcNow,
ExpiresUtc = DateTime.UtcNow.Add(tokenExpiration),
};

var ticket = new AuthenticationTicket(identity, props);

var accessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket);

来源,完整教程here

我还通过 SDK 收到了电子邮件,并将其与 POST 请求一起发送,因为我管理着 API 和消费者。不过警告:Facebook 用户可能不想给您电子邮件地址。

在 facebook 登录 Android 后获取电子邮件和 IOS

关于c# - 注册外部登录 Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30232223/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com