当前位置: 首页 > 知识库问答 >
问题:

使用.NET Core的Firebase身份验证(JWT)

阎慈
2023-03-14

我正在开发一个简单的API来处理Firebase所做的认证——稍后用于Android客户端。

因此,在Firebase控制台中,我启用了Facebook和Google登录方法并创建了一个示例html页面,我可以使用它来测试登录方法-下一个函数由按钮调用:

function loginFacebook() {
        var provider = new firebase.auth.FacebookAuthProvider();
        var token = "";
        firebase.auth().signInWithPopup(provider).then(function (result) {
            var token = result.credential.accessToken;
            var user = result.user;
            alert("login OK");
            user.getToken().then(function (t) {
                token = t;
                loginAPI();
            });
        }).catch(function (error) {
            var errorCode = error.code;
            var errorMessage = error.message;
            alert(errorCode + " - " + errorMessage);
        });
    }

接下来,我使用令牌,并通过jQuery的一个简单ajax调用将它发送到我的API:

function loginAPI()
{
    $.ajax({
        url: "http://localhost:58041/v1/Users/",
        dataType: 'json',
        type: 'GET',
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Accept", "application/json");
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.setRequestHeader("Authorization", "Bearer " + token);
        },
        error: function (ex) {
            console.log(ex.status + " - " + ex.statusText);
        },
        success: function (data) {
            console.log(data);
            return data;
        }
    });
}

下一站:API后端。网芯。

在启动下,我配置了 JwtBearer Auth(包 Microsoft.AspNetCore.Authentication.JwtBearer):

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
    AutomaticAuthenticate = true,
    IncludeErrorDetails = true,
    Authority = "https://securetoken.google.com/PROJECT-ID",
    TokenValidationParameters = new TokenValidationParameters
    {  
        ValidateIssuer = true,
        ValidIssuer = "https://securetoken.google.com/PROJECT-ID",
        ValidateAudience = true,
        ValidAudience = "PROJECT-ID",
        ValidateLifetime = true,
    },
});

这是控制器代码 - 带有 [授权] 属性:

[Authorize]
[Route("v1/[controller]")]
public class UsersController : Controller
{
    private readonly ILogger _logger;
    private readonly UserService _userService;

    public UsersController(ILogger<UsersController> logger, UserService userService)
    {
        _logger = logger;
        _userService = userService;
    }

    [HttpGet]
    public async Task<IList<User>> Get()
    {
        return await _userService.GetAll();
    }
}

API响应为200 OK (HttpContext。user . identity . is authenticated 在控制器内部是< code>true,但我认为不应该。我的问题是我不完全确定这是安全的。

这是如何检查JWT令牌的签名部分的?我看到了很多提到x509或RS256算法的代码示例,它们在哪里适合这个?不应该使用TokenValidationParameters类中的IssuerSigningKey 检查某种证书或私钥吗?我错过了什么?

有关该问题的相关知识来源:

  • https://blog.markvincze.com/secure-an-asp-net-core-api-with-firebase/
  • SPA-Firebase和. Net WebApi 2身份验证
  • https://stormpath.com/blog/token-authentication-asp-net-core
  • https://jwt.io/
  • https://firebase.google.com/docs/auth/admin/verify-id-tokens

共有3个答案

姬天宇
2023-03-14

NuGet 数据包正在使用旧的 ASP NET Core 1.x 身份验证机制

身份验证已更改:https://learn.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

邢骏
2023-03-14

对于后端端,有一个Nuget包可以为您提供以下技巧:

Install-Package AspNetCore.Firebase.Authentication

public void Configure(IApplicationBuilder app, IHostingEnvironment env,  ILoggerFactory loggerFactory)
{      
app.UseFirebaseAuthentication("https://securetoken.google.com/MYPROJECTNAME", "MYPROJECTNAME");
}

它进行受众、发布者、签名和有效性验证

后烨煜
2023-03-14

Firebase使用RSA256非对称密钥密码系统,这意味着它有一个公钥和一个私钥。使用私钥对令牌进行签名,而使用公钥验证令牌。

下图说明了令牌签名是如何发生的。

在登录和访问安全endpoint期间,涉及以下步骤。

  1. 当我们的应用程序启动时(然后也会定期启动),JwtBearerMiddleware调用 https://securetoken.google.com/my-firebase-project/.well-known/openid-configuration,在那里它可以访问Google的当前公钥。重要的是,当我们使用公钥非对称密码系统时,公钥不是作为秘密保存的,而是在众目睽睽之下发布的。
  2. 客户通过 Firebase 使用其凭据登录(这些是客户端自己的凭据,与用于签署令牌的密钥无关)。
  3. 如果登录成功,Firebase 会为客户端构造一个 JWT 令牌。此令牌的一个关键部分是它使用密钥对的私钥进行签名。与公钥相反,私钥永远不会公开,它在Google的基础设施中作为秘密保存。
  4. 客户端接收 JWT 令牌。
  5. 客户端在我们的 API 上调用安全终结点,并将令牌放在授权标头中。此时,管道中的 JwtBearerMiddleware 会检查此令牌,并验证它是否有效(如果它是使用 Google 的私钥签名的)。这里要意识到的重要一点是,为了进行验证,我们的 API 不需要访问私钥。只有公钥是必需的。验证后,中间件填充 HttpContext.User,并相应地填充 HttpContext.User.Identity.IsAuthentication

你可以在RSA Wikipedia页面上找到这个概念的更简单的描述,在我的博客文章中可以找到更多关于Firebase ASP.NET的信息。

 类似资料:
  • 我一直很难找到Google Firebase身份验证背后的SLA。根据托管和实时数据库的服务水平协议,Firebase的每月正常运行时间百分比应至少达到99.95%。它是否适用于身份验证服务?

  • 该应用程序应该接受用户电子邮件和密码,并使用Firebase身份验证作为后端。我使用像素2作为模拟器。每次应用程序处理登录功能时,它都会崩溃。 下面是Java文件和gradle文件 Java文件:

  • 在本章中,我们将匿名认证用户。 步骤1 - 启用匿名身份验证 这和我们以前的章节是一样的。需要打开Firebase信息中心,点击侧边菜单中的Auth和标签栏内的认证方法,需要启用匿名身份验证。 第2步 - 登录功能 可以使用方法进行此认证。 示例 让我们来看看下面的例子,参考示例代码 -

  • 使用,https://github.com/firebase/FirebaseUI-Android/tree/master/codelabs/chat作为登录的参考,我在键入时似乎遇到了问题 我只能键入Auth的提供者,而不能键入,为什么会这样,它提示我键入社会提供者。

  • 我目前正在使用FirebaseAuth和web小部件库firebaseui web开发基于VueJS的登录流原型。 成功认证后(无论是< code>password还是< code>google provider ),小部件加载栏会不断重复,firebaseui-web不会触发其< code > signinseccesswithauthresult 回调。但是对< code > identity

  • 于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,