首页 > 解决方案 > 使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?

问题描述

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

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

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

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

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

标签: angularsecurityhttp-headersjwtbasic-authentication

解决方案


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

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

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

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

这应该返回 JWT,您需要将其添加为每个请求的 Authorization 标头的一部分:

"Authorization": "Bearer TOKEN_GOES_HERE"

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


推荐阅读