使用 HTTP 基本身份验证获取 JWT 令牌有多安全?

How secure is using HTTP Basic Authentication to get JWT token?

我不太熟悉 HTTP 基本身份验证或一般的 Web 身份验证,因此我需要一些帮助来确定我计划的为我的应用程序提供身份验证的方法的安全性。

我计划用 PHP back-end 制作一个 Angular 应用程序。我想使用包含已登录用户 ID 数据的 JWT,以便在发出 HTTP 请求时,服务器可以确定该用户是否有权访问特定资源。

我认为,我的方法存在的问题是,必须首先使用 HTTP 基本身份验证,方法是执行 HTTP 请求以让用户登录,并首先为他们提供 JWT 令牌。

因此,如果我的 Angular 服务中的 verify() 函数如下所示,并且电子邮件和密码只是经过 base64 编码并在 Authorization HTTP 请求中发送 header.

verify(email: string, password: string): Observable<JSON> {
    let headers = new HttpHeaders({
        "Authorization": "Basic " + btoa(email + ":" + password)
    });
    return this.http.get<JSON>("http://localhost:80/verify", { headers: headers, withCredentials: true }).pipe(
        catchError(this.handleError)
    );
}

假设 HTTP 请求是通过 HTTPS 发送的,这有多安全?

如果 HTTPS 不是一个选项并且我无法获得 SSL 证书,是否有任何 Authorization header 类型可以帮助我的应用程序安全?

您混合使用两种方式来验证用户。

使用基本身份验证,您应该将用户名和密码作为每个安全请求的一部分发送。这不使用任何类似 JWT 令牌的东西。在每个请求上发送密码是一个安全问题,这就是我们使用 OAuth2 的原因,它使用我们应该在每个请求中发送的 Bearer 令牌 (JWT)。

这是如何工作的,您通常会向特定端点(主要是单独的身份验证服务器)发送 HTTP Post 请求。请求的 body 应包含用户名、密码和授权。

{
  "username": "foo",
  "password": "bar",
  "grand": "password"
}

这应该是 return 您需要在每个请求中作为授权的一部分添加的 JWT header:

"Authorization": "Bearer TOKEN_GOES_HERE"

您希望所有这些都通过 Https 完成,尤其是当您将用户名和密码发送到令牌端点时。