リクエストパラメータとしてJWTを受け入れ、認証時に新しいJWTを返すAPIを実装しています。Spring SecurityのUsernamePasswordAuthenticationをバイパスする方法
@RequestMapping(value = "/authenticate/token", method = RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity authenticate(@RequestParam("login_token") final String token, HttpServletResponse response) {
LOG.debug("Request to login with token : {}", token);
try {
String jwt = authService.loginByToken(token);
response.addHeader(JWTConfigurer.AUTHORIZATION_HEADER, "Bearer " + jwt);
return ResponseEntity.ok(new IdentityToken(jwt));
} catch (AuthenticationException ae) {
LOG.trace("Authentication exception trace: {}", ae);
return new ResponseEntity<>(Collections.singletonMap("AuthenticationException",
ae.getLocalizedMessage()), HttpStatus.UNAUTHORIZED);
}
}
マイloginByToken実装はこの時点で
@Override public String loginByToken(String token) {
if (!tokenProvider.validateToken(token)) {
throw new BadCredentialsException("Token is invalid.");
}
SecureToken secureToken = tokenProvider.parseJwtToken(token);
User user = userRepository.findByEmail(secureToken.getEmail());
// TODO: Check Account Status is valid, User status is valid
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.DATE, Constants.PASSWORD_EXPIRY_DAYS);
if (user.getPasswordExpiryDt() != null
&& user.getPasswordExpiryDt().after(c.getTime())) {
throw new BadCredentialsException("Password changed");
}
// TODO: Find how to create authentication object and return ID token.
// return tokenProvider.createToken(authentication, false);
return token;
}
以下のように見える、私は私が作成しcreateToken
関数に渡すことができるすべてのユーザーの詳細情報が含まれている認証オブジェクトを作成するかどうかはわかりませんアイデンティティトークン。
ここに私のプロジェクトは、この投稿に記載されている変更なしで - https://github.com/santoshkt/ngx-pipes-testです。
私は匿名認証、PreAuthenticatedなどについて読んだことがありますが、この場合の対処方法は不明です。これを行うにはどのような指針に感謝します。