여러 Oauth2 액세스 토큰


13

oAuth2를 사용하는 API와이 API를 백엔드로 사용하는 자체 모바일 앱이 있습니다. 사용자는 여러 기기 (예 : iPhone, iPad, Android 태블릿 또는 Android 전화)를 통해 동시에 로그온 할 수 있으므로 각 연결을 구별 할 API가 필요합니다. 별도의 액세스 토큰을 통해이 작업을 수행하고 싶습니다. 각 클라이언트는 별도의 액세스 토큰을 얻습니다.

문제는 우리가 사용하는 현재 구현 (spring-security-oauth2)이 client_id, username 및 scope을 기반으로 고유 키를 생성한다는 것입니다. 따라서 기본적으로 액세스 토큰을 얻을 때 모든 클라이언트는 동일한 사용자에 대해 동일한 액세스 토큰을 얻습니다. 이는 DefaultAuthenticationKeyGenerator를 사용하여 수행됩니다.

인증 키 생성기를 무시하고 클라이언트의 각 요청마다 새 액세스 토큰을 생성하는 것이 안전합니까?


2
범위를 사용하여 각 고객을 차별화 할 수 있습니까? 즉, ios에 "ios"범위, Android에 "android"범위, 태블릿에 "tablet"범위 등을 제공합니다. 그러나 FWIW는 내 자신의 TokenServices 구현을 작성했습니다 (실제로 기본값을 래퍼로 만들었다 고 생각합니다). 매번 새로운 토큰을 생성했습니다.
Rob

그러나 일반적으로 Spring Security OAuth2 구현은 XML 구성을 통해 일단 나에게 잘 작동했지만 토큰 및 인증 객체를 관리하는 것은 지속적인 어려움이었습니다.
Rob

2
Google에서 "DefaultAuthenticationKeyGenerator"를 검색하면 GitHub의 spring-security-oauth 라이브러리에있는 .java 파일이 생성되었습니다. 이 클래스는 AuthenticationKeyGenerator인터페이스를 구현합니다 . 자신 만의 구현을 만들어서 대신 사용할 수 있습니까?
Greg Burghardt


2
@Rob에 동의합니다. "android", "ios", "web"등의 요청으로 devicetype을 사용할 수 있습니다
Vikash Rajpurohit

답변:


1

스프링 클라우드는 이미이 동작을 제공합니다. 다른 고객을 추가하기 만하면됩니다. iosAppClient와 마찬가지로 AuthorizationServerConfiguration 클래스의 androidAppClient입니다.

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
                clients.inMemory().withClient("androidAppclient")
                    .secret("clientsecret")
                    .autoApprove(true)
                    .accessTokenValiditySeconds(120)
                    .authorizedGrantTypes("password")
                    .resourceIds("accountservice")
                    .scopes("read", "write")
                    .and()
                    .withClient("iosappclient")
                    ........

        }

백엔드에서 다음과 같은 clientID를 얻을 수 있습니다.

clientId = ((OAuth2Authentication) authentication).getOAuth2Request().getClientId();

clientId에 따라 다른 동작을 구현합니다.


0

한 가지 대답은 각 앱 플랫폼이 다른 클라이언트이므로 다른 클라이언트 ID를 가져야한다는 것입니다. 하나는 iOS 앱, 하나는 웹 사이트 등입니다.

iPad와 iPhone의 차이점은 OAuth 시스템에 의존하지 않는 것이 좋습니다.


0

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 다이제스트가 두 번 호출된다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.