2015-08-17 2 views
4

Мы реализовали API-интерфейс сервера, используя spring-oauth2. Я заметил, что сервер генерирует один и тот же токен для каждой комбинации идентификатор пользователя/клиента даже при вызове с отдельных устройств. Это вызывает проблему, так как мои клиенты могут запускать несколько экземпляров: например. приложения для Android и ios. Мне нужен способ связать токен с конкретным экземпляром, а не повторно использовать тот же токен.Spring Oauth2 - множественные маркеры на идентификатор клиента

Примером, где это требуется, является GCM (или push-уведомление), где API должен знать, к какому экземпляру он взаимодействует.

Это моя текущая весна конфигурация:

<http pattern="/oauth/token" create-session="stateless" 
    authentication-manager-ref="clientAuthenticationManager" 
    entry-point-ref="oauthAuthenticationEntryPoint" xmlns="http://www.springframework.org/schema/security"> 
    <intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" /> 
    <anonymous enabled="false" /> 
    <http-basic entry-point-ref="oauthAuthenticationEntryPoint" /> 
    <!-- include this only if you need to authenticate clients via request parameters --> 
    <custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" /> 
    <access-denied-handler ref="oauthAccessDeniedHandler" /> 
</http> 
<oauth:authorization-server 
    client-details-service-ref="mongoclientDetails" token-services-ref="tokenServices" 
    user-approval-handler-ref="userApprovalHandler"> 
    <!-- authorization-endpoint-url="/oauth/authorize" token-endpoint-url="/oauth/token"> --> 
    <oauth:authorization-code /> 
    <oauth:implicit /> 
    <oauth:refresh-token /> 
    <oauth:client-credentials /> 
    <oauth:password /> 
</oauth:authorization-server> 

Я предпочитаю не давать каждому из клиентов другой идентификатора, как это было бы нецелесообразным. Есть идеи?

+0

Вы получили ответ на этот вопрос? Я сталкиваюсь с подобной проблемой. – pacman

+0

К сожалению, не – checklist

+0

Взгляните на это. Посмотрите, поможет ли это. Http://stackoverflow.com/questions/27020702/spring-oauth2-generate-access-token-per-request-to-the-token-endpoint – pacman

ответ

0

Я думаю, что вы можете использовать идентификаторы устройств в своем запросе и генерировать токен для каждого идентификатора, или вы можете получить флаг, определяющий тип устройства, вызывающего ваш api (Android, IOS) и генерирующий токен для каждой платформы.

+0

Пользователь может иметь несколько устройств на одной платформе. В любом случае нам нужно иметь возможность обрабатывать идентификатор на сервере. Не знаете, как весна будет делать это. – checklist

+0

Отношение между пользователем и токеном доступа должно быть одним для многих, поэтому пользователь может иметь больше, чем на токене, но когда пользователь меняет свой пароль, вы отменяете все токены, чтобы вы могли генерировать больше, чем один токен одному пользователю на той же платформе. – abozaid

3

Таким образом, DefaultAuthenticationKeyGeneration использует client_id и область действия для создания ключа, и если это соответствует запросу для получения токена, он обслуживает ранее сгенерированный токен. Таким образом, в вашем случае у вас могут быть ios, android и идентификатор устройства для областей.

Вот мой код ..

@Configuration 
@EnableAuthorizationServer 
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { 

..... 

@Override 
public void configure(ClientDetailsServiceConfigurer clients) { 
    clients.inMemory() 
    .withClient("my-trusted-client-with-secret") 
     .authorizedGrantTypes("client_credentials") 
     .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT") 
     //.scopes("read", "write", "trust") 
     .secret("somesecret") 
    .accessTokenValiditySeconds(3600); 
} 

} 

Тесты

» curl -H "Accept: application/json" my-trusted-client-with-secret:[email protected]:8080/auth/oauth/token -d grant_type=client_credentials -d custid=1 -d siteid=2D -d scope="y" 
{"access_token":"cust:site1:2D","token_type":"bearer","expires_in":3282,"scope":"y"}%            

» curl -H "Accept: application/json" my-trusted-client-with-secret:[email protected]:8080/auth/oauth/token -d grant_type=client_credentials -d custid=1 -d siteid=3D -d scope="z" 
{"access_token":"cust:site1:3D","token_type":"bearer","expires_in":3290,"scope":"z"}%            

» curl -H "Authorization: Bearer cust:site:3D" http://localhost:8080/dtn-auth/home 
{"error":"invalid_token","error_description":"Invalid access token: cust:site:3D"}%              

» curl -H "Authorization: Bearer cust:site1:3D" http://localhost:8080/dtn-auth/home 
Hello World%                                

» curl -H "Authorization: Bearer cust:site1:2D" http://localhost:8080/dtn-auth/home 
Hello World% 

Как вы видите, я генерацию пользовательских маркеров на основе некоторого запроса Param. Возможно, вам также придется это сделать. Но пока все выглядит нормально. Мне удалось создать несколько токенов для одного и того же client_id, и оба этих токена были аутентифицированы для доступа к ресурсу с сервера ресурсов.

Смежные вопросы