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

7
我正在创建一个移动应用程序,允许用户通过Facebook登录。一旦登录,应用程序将保存一个Bearer令牌,用于进行进一步的请求。我试图将这个令牌传递给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错误,即使使用了有效的Bearer令牌。我不确定UseJwtBearerAuthentication是否与UseFacebookAuthentication兼容,如果兼容,我肯定是遗漏了一些代码。请问应该采取哪些步骤才能使其正常工作?


你尝试过注释掉JWT部分进行测试吗? - martennis
它是在尝试使用 FB 令牌调用 Web API 吗? - Ramankingdom
非常方便:使用C#访问Facebook API - ono2012
1个回答

1
我之前发布了同样的问题,但没有收到任何答案。无论如何,在谷歌上搜索,我找到了唯一(?)可能的解决方案。当您的客户登录Facebook时,您需要将您的Facebook令牌发送到您服务器的自定义端点。该端点应:
  • 使用Facebook API验证接收到的令牌是否有效(非常容易)
  • 尝试使用SignInManager<User>类的ExternalLoginSignInAsync方法登录用户:var result = await _signInManager.ExternalLoginSignInAsync(provider, userId, isPersistent: false);其中userId是Facebook用户id
  • 如果result.Succeeded为false:
    • 使用https://graph.facebook.com/{userId}端点获取Facebook用户信息
    • 创建一个包含该信息的User实体
    • 使用await _userManager.AddLoginAsync(user, userLoginInfo);创建数据库中的用户,其中userLoginInfo应包含provider(Facebook)、userId(Facebook用户Id)和application(您的应用程序名称)
    • 调用await _signInManager.SignInAsync(user, false);以登录用户

您可以使用_userManager.FindByIdAsync(userId);从数据库中获取用户

现在,您的API可以返回一个令牌,该令牌将被接受为“Authorization”标头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接