使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?

Posted

技术标签:

【中文标题】使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?【英文标题】:How secure is using HTTP Basic Authentication to get JWT token? 【发布时间】:2019-01-05 17:52:09 【问题描述】:

我一般不太熟悉 HTTP 基本身份验证或 Web 身份验证,因此我希望得到一些帮助来确定我计划的为我的应用提供身份验证的方法有多安全。

我计划制作一个带有 php 后端的 Angular 应用程序。我想使用包含登录用户 ID 的数据的 JWT,因此当发出 HTTP 请求时,服务器可以确定该用户是否有权访问特定资源。

我认为,问题在于我的方法必须首先使用 HTTP 基本身份验证,方法是执行 HTTP 请求以登录用户,然后给他们一个 JWT 令牌。

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

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 标头类型可以帮助我的应用程序安全?

【问题讨论】:

“是否有任何授权标头类型可以帮助我的应用程序安全?” 不,如果您通过 HTTP 发送用户名和密码,那么您'基本上以明文形式发送它们 使用 jwt 时不需要 http 基本身份验证。通常,您会将用户名和密码作为正文的一部分发布到将返回 jwt 的令牌端点。您不应为此使用 http,而应仅使用 https(您可能应该对所有内容都使用 https) 【参考方案1】:

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

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

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


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

这应该会返回您需要在每个请求的授权标头中添加的 JWT:

"Authorization": "Bearer TOKEN_GOES_HERE"

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

【讨论】:

哦,好吧,我想我只是不确定通过 HTTPS 发送 HTTP Post 请求是否安全,但我想是的。另一个相关的问题,可能是一个愚蠢的问题,因为 Angular 客户端需要知道 JWT 令牌是什么,以便在每个请求的 Bearer 身份验证方案中设置它,我的后端应该如何通过一些方式将该令牌提供给客户端某种 HTTP 标头? 令牌端点在 http post 请求响应中将令牌作为正文的一部分返回。然后,您可以保存令牌客户端并使用 http 拦截器将其添加到每个请求中。 作为 http post requests 响应正文的一部分到底是什么意思?这是否意味着在我的 PHP 中放入 echo json_encode($jwt) 以将该令牌返回给我的客户?至于保存令牌客户端,我可能不想将其保存在 localStorage 或 cookie 中以防止 CSRF 攻击,对吧? 我不熟悉 php,可能有一个库可以处理这些东西。通常,您确实将令牌保存在本地存储或 cookie 中。

以上是关于使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JwtAuthForWebAPI 的 Web APi2 身份验证不接受 JWT 令牌

REST 安全性,使用基本身份验证和 jwt 令牌验证是一种不好的做法吗?

如何测试使用 JWT 身份验证的节点 API(使用用户登录获取令牌)

身份验证后请求其他服务时如何从 JWT 令牌获取用户名?

实现 JWT 身份验证 Azure Function 3.x - 使用 JWT 令牌获取当前用户的声明

使用 otp 获取 api 令牌的 Django REST 框架的 JWT 身份验证