我需要对与RESTapi通信的移动应用程序的用户进行身份验证。
在做了一些研究之后,我找到了两种方法:
- Firebase身份验证(否,因为我有自己的数据库(
- JWT的使用
所以我对JWTs:有疑问
如果我使用HTTPS连接,是否会有人窃取令牌(例如中间没有人(
API必须为每个请求发送一个新令牌(这样我可以缩短代币的使用寿命?(。
为了避免用户重新连接,我需要使用刷新令牌,它可以是另一个JWT吗
- 这取决于,如果您将其存储在本地存储或会话存储中,则有可能通过xss攻击窃取它。如果你存储在httpOnly安全cookie上,那就更难了。但是当您使用https时,不可能从请求中窃取它
- 不,有一个令牌有效期,例如1小时、1天等
- 是的。它应该是另一个令牌,它被称为刷新令牌,你可以点击此处阅读更多信息:https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/
因为您使用自己的数据库,所以JWT是您的最佳选择。
1-如果我使用HTTPS连接,是否会有人窃取令牌?:-是的,他们可以窃取令牌,mitma是可能的,但即使他们会缓和令牌,你的服务器也会通过验证令牌和验证令牌的颁发者来了解(你的客户端和服务器可以使用私钥在客户端加密响应,并在服务器端解密和验证(
2-API必须为每个请求发送一个新令牌?(这样我就可以缩短代币的使用寿命?(是的,每个代币都是不同的。JWT代币是您的帖子数据、发布者、主题和其他附加数据的加密形式。因此,如果你的帖子数据每次都不同,那么代币也会不同。
3-为了避免用户重新连接,我需要使用刷新令牌,它可以是另一个JWT吗不需要另一个JWT。
您可以使用Jawa JWT图书馆:-访问https://github.com/auth0/java-jwt
并使用此类创建、验证和解码JWT令牌。
public class JWTTokenVerifier {
public String CreateToken(String body) {
String token = "";
try {
Algorithm algorithm = Algorithm.HMAC256(Constants.APP_SECRET);
token = JWT.create()
.withClaim("body", body)
.withIssuer("auth0")
.sign(algorithm);
} catch (JWTCreationException exception) {
//Invalid Signing configuration / Couldn't convert Claims.
exception.printStackTrace();
}
System.out.println("TOKEN IS > " + token);
return token;
}
public void verifyTokenAndDecodeResponse(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(Constants.APP_SECRET);
JWTVerifier verifier = JWT.require(algorithm)
.build(); //Reusable verifier instance
DecodedJWT jwt = verifier.verify(token);
String payload = jwt.getPayload();
Base64 base64Url = new Base64(true);
payload=new String(base64Url.decode(payload));
System.out.println("payload is " + payload);
} catch (JWTVerificationException exception) {
System.out.printf("Unable to parse token");
exception.printStackTrace();
}
}
}