当前,我正在一个项目中,需要在登录后立即在Spring成功处理程序中收集需求 accessToken 。我阅读了不同的博客,但找不到任何可能的解决方案。在这里,我提供了我尝试过的代码段,
这是我尝试获取accessToken的成功处理程序。但是,当我尝试将 authentication.getDetails()强制转换为 OAuth2AuthenticationDetails 时,却出现异常。
@Component
public class AuthSuccessListener implements ApplicationListener<AuthenticationSuccessEvent> {
@Override
public void onApplicationEvent(AuthenticationSuccessEvent event) {
UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
System.out.println(userDetails);
System.out.println("pass is " + userDetails.getPassword());
System.out.println("username is " + userDetails.getUsername());
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
//Authentication authentication = event.getAuthentication();
OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
String accessToken = details.getTokenValue();
System.out.println(accessToken);
}
}
我不知道这种方法是否有效。如果在SuccessHandler或其他位置登录后还有其他方法可以获取accessToken,请帮助解决此问题。
答案 0 :(得分:0)
至少我找到了一种在登录后立即在succeshandler获取令牌的解决方案。简而言之,我还没有相关的解决方案,所以这就是我发布此答案的原因。我这样解决了这个问题。
@Component
public class AuthSuccessListener implements ApplicationListener<AuthenticationSuccessEvent> {
private final TokenStore tokenStore;
public AuthSuccessListener(TokenStore tokenStore) {
this.tokenStore = tokenStore;
}
@Override
public void onApplicationEvent(AuthenticationSuccessEvent event) {
UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
String accessToken = null;
List<OAuth2AccessToken> tokens = (List<OAuth2AccessToken>) tokenStore.findTokensByClientIdAndUserName("your Client Id", userDetails.getUsername());
if (tokens.size() > 0) {
accessToken = tokens.get(0).getValue();
}
}
}
在这里您可以看到我使用 TokenStore 来获取令牌,方法是将 clientId 和 username 与方法tokenStore.findTokensByClientIdAndUserName("your Client Id", userDetails.getUsername());
一起使用
就是这样。