“Access Token”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) |
Jihongchang(讨论 | 贡献) (→实现示例代码) |
||
(未显示同一用户的1个中间版本) | |||
第15行: | 第15行: | ||
Access Token 有助于保护用户的隐私和安全。 | Access Token 有助于保护用户的隐私和安全。 | ||
− | === | + | === 实现示例代码 === |
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<dependency> | <dependency> | ||
第53行: | 第53行: | ||
.setIssuedAt(now) | .setIssuedAt(now) | ||
.setExpiration(expirationDate) | .setExpiration(expirationDate) | ||
− | .signWith(SignatureAlgorithm.HS256, SECRET_KEY) | + | .signWith(SignatureAlgorithm.HS256, SECRET_KEY) //应用 Hash-based Message Authentication Code with SHA-256 签名算法 |
.compact(); | .compact(); | ||
} | } |
2023年2月15日 (三) 03:07的最新版本
Access Token(访问令牌)是用于访问受保护资源的一种身份验证凭证。一般是一个字符串,由服务器颁发给客户端应用程序,以便该应用程序可以使用这个令牌来获取对受保护资源的访问权限。
比如,使用社交媒体应用程序登录时,应用程序就会向社交媒体服务器请求 Access Token。
服务器会验证登录人的身份并向应用程序颁发 Access Token。
应用程序随后可以使用 Access Token 来获取受保护资源,比如用户个人信息。
Access Token 通常有一个过期时间,过期之后,客户端需要重新请求 Access Token。
Access Token 还可以通过撤销来使其无效,例如,当客户端注销应用程序或更改了其密码时。
Access Token 是一种安全性较高的身份验证凭证,因为它只授予客户端对特定资源的访问权限,而不是用户的完整凭证(因为它不包含用户的用户名和密码)。
Access Token 有助于保护用户的隐私和安全。
实现示例代码
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class JwtTokenService {
private static final String SECRET_KEY = "your-secret-key";
private static final long EXPIRATION_TIME = 86400000; // 1 day in milliseconds
/*
* 根据给定的 User 对象生成一个新的 JWT,其中包含了该用户的用户名作为 token 的 subject,以及一个过期时间(1 天)和加密签名。
*/
public String generateToken(User user) {
Date now = new Date();
Date expirationDate = new Date(now.getTime() + EXPIRATION_TIME);
return Jwts.builder()
.setSubject(user.getUsername())
.setIssuedAt(now)
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.HS256, SECRET_KEY) //应用 Hash-based Message Authentication Code with SHA-256 签名算法
.compact();
}
/*
从给定的 JWT 中提取出用户名
*/
public String getUsernameFromToken(String token) {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
/*
验证给定的 JWT 是否有效,包括其是否过期并且用户名是否与给定的 User 对象匹配
*/
public boolean validateToken(String token, User user) {
String username = getUsernameFromToken(token);
return username.equals(user.getUsername()) && !isTokenExpired(token);
}
private boolean isTokenExpired(String token) {
Date expirationDate = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody()
.getExpiration();
return expirationDate.before(new Date());
}
}