【发布时间】:2017-07-09 06:47:33
【问题描述】:
我正在开发一个简单的 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 后端 - 使用 .NET Core 编写。
在 Startup 下我配置了 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] 属性:
[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.IsAuthenticated 在控制器内是 true),但我认为它不应该。我的问题是我不完全确定这是安全的。
这是如何检查 JWT 令牌的签名部分的?我看到很多代码示例提到 x509 或 RS256 算法,它们在哪里适合?不应该使用TokenValidationParameters 类中的IssuerSigningKey 或TokenDecryptionKey 检查某种证书或私钥吗?我错过了什么?
有关该问题的相关知识来源:
【问题讨论】:
-
即使不传递
Authorization标头,响应也是200 OK?那肯定是错的。在app.UseJwtBearerAuthentication()之前或之后有app.UseMvc()电话吗? -
如果我没有传递
Authorization标头,则响应为401。app.UseMvc()在app.UseJwtBearerAuthentication()之后。我只是不确定安全性。我试图破解我的应用程序但无法破解。也许我只是偏执。 -
嗯,但你说响应“不应该是 200”。为什么?您是否故意在标头中传递了不正确的标记?或者你为什么期望响应不是 200?
-
由于我没有在我的代码中的任何地方提供私钥,所以我认为这应该行不通,但是在无法破解它之后,我认为我只是偏执。
-
恐怕您误解了令牌签名在此流程中的工作原理。您的应用程序不应提供(或拥有)私钥(或任何类型的密钥)。我在我的博文中添加了对流程的描述:blog.markvincze.com/secure-an-asp-net-core-api-with-firebase/…
标签: c# authentication asp.net-web-api asp.net-core firebase-authentication