Java开发者必知的Access Token奥秘:从获取到使用一网打尽

一、什么是Access Token?
Access Token,翻译成中文就是访问令牌,它是一种用于在客户端和服务端之间传递用户身份信息的机制。在Java开发中,Access Token通常用于实现单点登录(SSO)和授权机制。
二、Access Token的获取
1. 使用OAuth2.0协议获取
OAuth2.0是目前最常用的授权协议之一,它定义了一种安全的授权框架,允许第三方应用在用户的授权下访问受保护的资源。在Java中,我们可以使用Spring Security或Apache Oltu等框架来支持OAuth2.0。
以下是一个简单的使用Spring Security实现Access Token获取的示例:
(1)配置OAuth2.0认证服务器
在Spring Security的配置文件中,我们需要添加以下配置:
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ... 其他配置 ...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
// ... 其他配置 ...
}
```
(2)创建一个OAuth2.0认证服务器
```
@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.tokenStore(jwtTokenStore())
.userDetailsService(userDetailsService());
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security
.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Bean
public JwtTokenStore jwtTokenStore() {
return new JwtTokenStore(jwtAccessTokenConverter());
}
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("123456");
return converter;
}
// ... 其他配置 ...
}
```
(3)获取Access Token
```
public class OAuth2Client {
private RestTemplate restTemplate = new RestTemplate();
public String getAccessToken(String clientId, String clientSecret) {
MultiValueMap
params.add("grant_type", "password");
params.add("username", "user");
params.add("password", "password");
String url = "http://localhost:8080/oauth/token";
HttpEntity
ResponseEntity
return response.getBody().getAccessToken();
}
}
```
2. 使用JWT(JSON Web Token)直接生成
JWT是一种基于JSON的开放标准(RFC 7519),用于在各方之间安全地传输信息。在Java中,我们可以使用jjwt库来生成JWT Access Token。
以下是一个简单的使用jjwt生成Access Token的示例:
```
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JwtUtil {
private static final String SECRET_KEY = "123456";
public static String generateAccessToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小时后过期
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
}
```
三、Access Token的使用
1. 使用Access Token进行API调用
在Java中,我们可以使用Spring Cloud Gateway或Apache HttpClient等框架来实现使用Access Token进行API调用的功能。
以下是一个使用Spring Cloud Gateway进行API调用的示例:
```
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/api/**").filters(f -> f.filter(new JWTAuthenticationFilter()))
.uri("lb://SERVICE-NAME"))
.build();
}
}
@Component
public class JWTAuthenticationFilter implements GlobalFilter, Ordered {
private static final String BEARER_PREFIX = "Bearer ";
private static final String AUTHORIZATION_HEADER = "Authorization";
@Override
public Mono
ServerHttpRequest request = exchange.getRequest();
String authHeader = request.getHeaders().getFirst(AUTHORIZATION_HEADER);
if (authHeader != null && authHeader.startsWith(BEARER_PREFIX)) {
String token = authHeader.substring(BEARER_PREFIX.length());
// ... 验证token有效性 ...
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -100;
}
}
```
2. 使用Access Token实现单点登录
在单点登录(SSO)系统中,Access Token通常用于实现不同系统之间的用户认证。以下是一个使用Spring Security和Spring Session实现SSO的示例:
(1)配置Spring Security
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ... 其他配置 ...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
// ... 其他配置 ...
}
```
(2)配置Spring Session
```
@Configuration
@EnableSessionManagement
public class SessionConfig {
@Bean
public HttpSessionStrategy sessionStrategy() {
return new CustomHttpSessionStrategy();
}
}
@Component
public class CustomHttpSessionStrategy implements HttpSessionStrategy {
// ... 实现单点登录逻辑 ...
}
```
四、总结
Access Token在Java开发中扮演着重要的角色,它不仅可以帮助我们实现API调用和单点登录,还可以提高系统的安全性。通过本文的介绍,相信大家对Access Token有了更深入的了解。在实际开发中,我们需要根据具体需求选择合适的获取方式和使用场景,以确保系统的稳定性和安全性。






