“Access Token”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (建立内容为“1”的新页面) |
Jihongchang(讨论 | 贡献) (→实现示例代码) |
||
(未显示同一用户的3个中间版本) | |||
第1行: | 第1行: | ||
− | 1 | + | Access Token(访问令牌)是用于访问受保护资源的一种身份验证凭证。一般是一个字符串,由服务器颁发给客户端应用程序,以便该应用程序可以使用这个令牌来获取对受保护资源的访问权限。 |
+ | |||
+ | 比如,使用社交媒体应用程序登录时,应用程序就会向社交媒体服务器请求 Access Token。 | ||
+ | |||
+ | 服务器会验证登录人的身份并向应用程序颁发 Access Token。 | ||
+ | |||
+ | 应用程序随后可以使用 Access Token 来获取受保护资源,比如用户个人信息。 | ||
+ | |||
+ | Access Token 通常有一个过期时间,过期之后,客户端需要重新请求 Access Token。 | ||
+ | |||
+ | Access Token 还可以通过撤销来使其无效,例如,当客户端注销应用程序或更改了其密码时。 | ||
+ | |||
+ | Access Token 是一种安全性较高的身份验证凭证,因为它只授予客户端对特定资源的访问权限,而不是用户的完整凭证(因为它不包含用户的用户名和密码)。 | ||
+ | |||
+ | Access Token 有助于保护用户的隐私和安全。 | ||
+ | |||
+ | === 实现示例代码 === | ||
+ | <syntaxhighlight lang="xml"> | ||
+ | <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> | ||
+ | |||
+ | </syntaxhighlight><syntaxhighlight lang="java"> | ||
+ | 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()); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> |
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());
}
}