如何在.Net Core API中验证Facebook JWT

tVo*_*s42 7 .net c# authentication facebook

我正在创建一个允许用户通过Facebook登录的移动应用程序.登录后,应用程序会保留用于进一步请求的Bearer令牌.我试图将此令牌传递给C#.Net Core API.我试图编写尽可能少的auth代码,因为我自己这样做很容易出现巨大的安全问题.

目前我的代码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();
}
Run Code Online (Sandbox Code Playgroud)

这样,即使使用有效的承载令牌,所有请求都返回401.现在我不是100%肯定UseJwtBearerAuthentication甚至兼容UseFacebookAuthentication,如果它是我确定我在这里缺少一些代码.我应该采取哪些步骤来实现这一目标?

Kru*_*sty 1

我前几天发布了同样的问题,但没有收到任何答复。不管怎样,谷歌搜索,我找到了唯一(?)可能的解决方案。当您的客户端登录 Facebook 时,您必须将 Facebook 令牌发送到服务器的自定义端点。该端点应:

  • 使用 Facebook API 验证收到的令牌是否有效(非常简单)
  • ExternalLoginSignInAsync尝试使用类方法记录用户SignInManager<User>:Facebook id 用户在var result = await _signInManager.ExternalLoginSignInAsync(provider, userId, isPersistent: false);哪里userId
  • 如果 result.Succeeded 为 false:
    • 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标头的令牌