Spring Boot 및 OAuth2로 백엔드를 개발하는 동안 동일한 문제가 발생했습니다. 내가 만난 문제는 여러 장치가 동일한 토큰을 공유하면 한 장치가 토큰을 새로 고치면 다른 장치는 단서가 없으며 긴 장치가 짧아서 두 장치가 모두 토큰 새로 고침 열풍에 빠졌다는 것입니다. 내 솔루션은 기본값 AuthenticationKeyGenerator
을 키 생성기 혼합물 DefaultAuthenticationKeyGenerator
의 새 매개 변수 를 재정의 하고 추가하는 사용자 지정 구현 으로 대체하는 것이 었습니다 client_instance_id
. 그런 다음 모바일 클라이언트는이 매개 변수를 전송하는데,이 매개 변수는 앱 설치 (iOS 또는 Android)에서 고유해야합니다. 대부분의 모바일 앱은 이미 특정 형태로 애플리케이션 인스턴스를 추적하기 때문에 특별한 요구 사항은 아닙니다.
public class EnhancedAuthenticationKeyGenerator extends DefaultAuthenticationKeyGenerator {
public static final String PARAM_CLIENT_INSTANCE_ID = "client_instance_id";
private static final String KEY_SUPER_KEY = "super_key";
private static final String KEY_CLIENT_INSTANCE_ID = PARAM_CLIENT_INSTANCE_ID;
@Override
public String extractKey(final OAuth2Authentication authentication) {
final String superKey = super.extractKey(authentication);
final OAuth2Request authorizationRequest = authentication.getOAuth2Request();
final Map<String, String> requestParameters = authorizationRequest.getRequestParameters();
final String clientInstanceId = requestParameters != null ? requestParameters.get(PARAM_CLIENT_INSTANCE_ID) : null;
if (clientInstanceId == null || clientInstanceId.length() == 0) {
return superKey;
}
final Map<String, String> values = new LinkedHashMap<>(2);
values.put(KEY_SUPER_KEY, superKey);
values.put(KEY_CLIENT_INSTANCE_ID, clientInstanceId);
return generateKey(values);
}
}
그런 다음 비슷한 방식으로 주입합니다.
final JdbcTokenStore tokenStore = new JdbcTokenStore(mDataSource);
tokenStore.setAuthenticationKeyGenerator(new EnhancedAuthenticationKeyGenerator());
HTTP 요청은 다음과 같습니다.
POST /oauth/token HTTP/1.1
Host: {{host}}
Authorization: Basic {{auth_client_basic}}
Content-Type: application/x-www-form-urlencoded
grant_type=password&username={{username}}&password={{password}}&client_instance_id={{instance_id}}
이 방법을 사용하면 클라이언트가를 보내지 않으면 client_instance_id
기본 키가 생성되고 인스턴스가 제공되면 동일한 인스턴스에 대해 매번 같은 키가 반환 된다는 이점 이 있습니다. 또한 키는 플랫폼에 독립적입니다. 단점은 내부적으로 사용되는 MD5 다이제스트가 두 번 호출된다는 것입니다.