我正在开发一个简单的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
或
检查某种证书或私钥吗?我错过了什么?
有关该问题的相关知识来源:
NuGet 数据包正在使用旧的 ASP NET Core 1.x 身份验证机制
身份验证已更改:https://learn.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x
对于后端端,有一个Nuget包可以为您提供以下技巧:
Install-Package AspNetCore.Firebase.Authentication
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseFirebaseAuthentication("https://securetoken.google.com/MYPROJECTNAME", "MYPROJECTNAME");
}
它进行受众、发布者、签名和有效性验证
Firebase使用RSA256非对称密钥密码系统,这意味着它有一个公钥和一个私钥。使用私钥对令牌进行签名,而使用公钥验证令牌。
下图说明了令牌签名是如何发生的。
在登录和访问安全endpoint期间,涉及以下步骤。
JwtBearerMiddleware
调用 https://securetoken.google.com/my-firebase-project/.well-known/openid-configuration
,在那里它可以访问Google的当前公钥。重要的是,当我们使用公钥非对称密码系统时,公钥不是作为秘密保存的,而是在众目睽睽之下发布的。授权
标头中。此时,管道中的 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提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,