Access Token

来自姬鸿昌的知识库
跳到导航 跳到搜索

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());
    }
}