Опубликован пакет AspNetCore.Firebase.Authentication 2.0, который поддерживает .aspnetcore2.0
рабатываю простой 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);
});
}
затем я использую токен и отправляю его в свой API с помощью простого вызова ajax из jQuery здесь:
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-интерфейс - написанный на .NET Core.
Под Startup я настроил аутентификацию JwtBearer (пакет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]
атрибут:
[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 ОК (HttpContext.User.Identity.IsAuthenticated
являетсяtrue
внутри контроллера), но я думаю, что не должно. Моя проблема в том, что я не совсем уверен, что это безопасно.
Как это проверяет часть подписи токена JWT? Я видел много примеров кода, упоминающих алгоритм x509 или RS256, где они подходят для этого? Не следует проверять какой-либо сертификат или закрытый ключ сIssuerSigningKey
или жеTokenDecryptionKey
отTokenValidationParameters
учебный класс? Что мне не хватает?
Соответствующие источники знаний о проблеме:
https://blog.markvincze.com/secure-an-asp-net-core-api-with-firebase/SPA - Аутентификация Firebase и .Net WebApi 2https://stormpath.com/blog/token-authentication-asp-net-corehttps://jwt.io/https://firebase.google.com/docs/auth/admin/verify-id-tokens