我正在创建一个允许用户通过Facebook登录的移动应用程序。登录后,应用程序将保留用于发出进一步请求的持有者令牌。我正在尝试将此令牌传递给 C# .Net Core API。我正在尝试编写尽可能少的身份验证代码,因为自己做很容易出现巨大的安全问题。
目前我在Startup.cs
中的代码如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
app.UseJwtBearerAuthentication(new JwtBearerOptions {
AuthenticationScheme = "Bearer",
});
app.UseFacebookAuthentication(new FacebookOptions {
AppId = "****",
AppSecret = "****",
SignInScheme = "Bearer"
});
app.UseMvc();
}
这样,所有请求都返回 401,即使使用有效的持有者令牌也是如此。现在我不是 100% 确定UseJwtBearerAuthentication
甚至与UseFacebookAuthentication
兼容,如果是,我确定我在这里缺少一些代码。我应该采取哪些步骤来使其正常工作?
我前几天发布了同样的问题,但我没有得到任何答复。 无论如何,谷歌搜索,我找到了唯一(?(可能的解决方案。 当您的客户登录到Facebook时,您必须将Facebook令牌发送到服务器的自定义端点。 此端点应:
- 使用Facebook API验证收到的令牌是否有效(非常简单(
- 尝试使用
SignInManager<User>
类ExternalLoginSignInAsync
方法登录用户:var result = await _signInManager.ExternalLoginSignInAsync(provider, userId, isPersistent: false);
userId
是 Facebook ID 用户的位置 - 如果结果。成功为假:
- 使用
https://graph.facebook.com/{userId}
端点获取 Facebook 用户信息 - 使用该信息创建用户实体
- 使用
await _userManager.AddLoginAsync(user, userLoginInfo);
在数据库中创建用户,其中userLoginInfo
应包含provider
(Facebook(、userId
(Facebook 用户 ID(和application
(您的应用名称( - 调用
await _signInManager.SignInAsync(user, false);
对用户进行签名
- 使用
您可以使用_userManager.FindByIdAsync(userId);
从数据库中获取用户
现在,您的 API 可以返回一个令牌,该令牌将被接受为标头Authorization