我总体上不太熟悉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
标头类型可以帮助我保护应用程序的安全?
答案 0 :(得分:3)
您正在混合两种方式来验证用户身份。
使用基本身份验证,您应该将用户名和密码作为每个受保护的请求的一部分发送。它不使用JWT令牌之类的东西。在每个请求上发送密码都是一个安全问题,这就是我们使用OAuth2的原因,该OAuth2使用了我们应该随每个请求发送的承载令牌(JWT)。
这是如何工作的,通常是您将HTTP Post请求发送到特定端点(通常是单独的身份验证服务器)。请求的正文应包含用户名,密码和授予。
{
"username": "foo",
"password": "bar",
"grand": "password"
}
这应该返回JWT,您需要在每个请求中添加该JWT作为Authorization标头的一部分:
"Authorization": "Bearer TOKEN_GOES_HERE"
您希望所有这些操作都通过Https完成,绝对是在将用户名和密码发送到令牌端点时进行的。