什么是Token?
Token(令牌)是一种用于身份验证和授权的字符串,通常在客户端和服务器之间传递,Token可以是JSON Web Token(JWT)、OAuth 2.0 Bearer Token等形式,Token的主要作用是在用户登录后,将用户的唯一标识(如用户ID)存储在客户端,以便在后续的请求中进行身份验证,这样,服务器就可以根据Token判断用户是否具有访问特定资源的权限。
Java实现Token生成
1、JWT(JSON Web Token)
JWT是一种基于JSON的开放标准(RFC 7519),用于在网络上安全地传输信息,JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),头部包含令牌类型和过期时间等信息,载荷包含用户信息,签名用于验证令牌的完整性和真实性。
下面是一个简单的Java代码示例,使用jjwt库生成JWT Token:
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtUtil { private static final String SECRET_KEY = "your_secret_key"; public static String generateToken(String username) { long currentTimeMillis = System.currentTimeMillis(); Date now = new Date(currentTimeMillis); Date expiration = new Date(currentTimeMillis + 3600 * 1000); // 设置过期时间为1小时 return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); } }
2、OAuth 2.0 Bearer Token
OAuth 2.0 Bearer Token是一种授权框架,允许用户授权第三方应用访问其资源,Bearer Token是一种简单的授权机制,它只是在HTTP请求头中添加一个名为"Authorization"的字段,其值为"Bearer "加上Token。
下面是一个简单的Java代码示例,使用Spring Security库生成OAuth 2.0 Bearer Token:
import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore; import org.springframework.security.oauth2.provider.token.UsernamePasswordAuthenticationToken; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; import java.util.UUID; @Service public class OAuth2TokenService { private final TokenStore tokenStore = new InMemoryTokenStore(); public String generateAccessToken(OAuth2Authentication authentication) { Map<String, Object> additionalInfo = new HashMap<>(); additionalInfo.put("scope", "read"); // 可以自定义权限范围 String accessToken = generateAccessToken(authentication, additionalInfo); saveAccessToken(accessToken, authentication); // 将Token存储到内存中,实际应用中可以使用数据库存储 return accessToken; } private String generateAccessToken(OAuth2Authentication authentication, Map<String, Object> additionalInfo) { String accessToken = generateAccessTokenValue(); // 由OAuth2ProviderDetails配置类生成唯一的Token值 DefaultOAuth2AccessToken token = new DefaultOAuth\u0026lt;>(accessToken, authentication); // 将Token和认证信息封装成DefaultOAuth2AccessToken对象 token.setAdditionalInformation(additionalInfo); // 将额外信息添加到Token中 return accessToken; } }
Java实现Token验证
1、JWT验证
要验证JWT Token,可以使用jjwt库提供的JwtParser
类解析Token,然后检查其签名是否正确,以下是一个简单的Java代码示例:
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jws; import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/192169.html