Как установить expire_in в OAUTH 2.0?

Я использую OAuth 2.0 с spring для генерации маркера, и я хочу установить expire_in вручную, чтобы токен мог истечь в соответствии с моими критериями. Кто-нибудь мне помогает?

Это мой ответ:

{
    access_token: "c7a6cb95-1506-40e7-87d1-ddef0a239f64"
    token_type: "bearer"
    expires_in: 43199
    scope: "read"
}

Ответы

Ответ 1

public interface OAuth2AccessToken {

    public static String BEARER_TYPE = "Bearer";

    public static String OAUTH2_TYPE = "OAuth2";

    /**
     * The access token issued by the authorization server. This value is REQUIRED.
     */
    public static String ACCESS_TOKEN = "access_token";

    /**
     * The type of the token issued as described in <a
     * href="http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-7.1">Section 7.1</a>. Value is case insensitive.
     * This value is REQUIRED.
     */
    public static String TOKEN_TYPE = "token_type";

    /**
     * The lifetime in seconds of the access token. For example, the value "3600" denotes that the access token will
     * expire in one hour from the time the response was generated. This value is OPTIONAL.
     */
    public static String EXPIRES_IN = "expires_in";

    /**
     * The refresh token which can be used to obtain new access tokens using the same authorization grant as described
     * in <a href="http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-6">Section 6</a>. This value is OPTIONAL.
     */
    public static String REFRESH_TOKEN = "refresh_token";

    /**
     * The scope of the access token as described by <a
     * href="http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.3">Section 3.3</a>
     */
    public static String SCOPE = "scope";

    /**
     * The additionalInformation map is used by the token serializers to export any fields used by extensions of OAuth.
     * @return a map from the field name in the serialized token to the value to be exported. The default serializers 
     * make use of Jackson automatic JSON mapping for Java objects (for the Token Endpoint flows) or implicitly call 
     * .toString() on the "value" object (for the implicit flow) as part of the serialization process.
     */
    Map<String, Object> getAdditionalInformation();

    Set<String> getScope();

    OAuth2RefreshToken getRefreshToken();

    String getTokenType();

    boolean isExpired();

    Date getExpiration();

    int getExpiresIn();

    String getValue();

}

Ответ 2

Его можно установить с помощью ClientBuilder, полученного из a ClientDetailsServiceConfigurer.

@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            .withClient("client")
            .secret("secret")
            .authorizedGrantTypes("authorization_code", "refresh_token", "password")
            .scopes("app")
            .accessTokenValiditySeconds(30);
    }

    // ... additional configuration
}

или непосредственно на DefaultTokenServices в зависимости от ваших потребностей.

@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

        // optionally here you could just get endpoints.getConsumerTokenService()
        // and cast to DefaultTokenServices and just set values needed

        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setTokenStore(endpoints.getTokenStore());
        tokenServices.setSupportRefreshToken(true);
        tokenServices.setClientDetailsService(endpoints.getClientDetailsService());
        tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer());
        tokenServices.setAccessTokenValiditySeconds(60);

        endpoints.tokenServices(tokenServices);            
    }
}

Ответ 3

настройте свою конфигурацию oauth, изменив свой Bean TokenServices и установив свойство accessTokenValiditySeconds:

<bean id="tokenServices"
    class="org.springframework.security.oauth2.provider.token.DefaultTokenServices">
    <property name="accessTokenValiditySeconds" value="1" />
    <property name="tokenStore" ref="tokenStore" />
    <property name="supportRefreshToken" value="true" />
    <property name="clientDetailsService" ref="clientDetails" />
</bean>

Ответ 4

Вы также можете настроить DefaultTokenServices в application.yaml файле.

security:
  oauth2:
    client:
      clientId: client-id
      clientSecret: client-secret
      authorized-grant-types: authorization_code,refresh_token,password
      scope: openid
      access-token-validity-seconds: 30

Ответ 5

  • Создайте собственный класс AuthorizationCodeAccessTokenProvider и переопределите родительский

    public method obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request)
    
  • В переопределенном методе вашего пользовательского класса вызовите логику программы своего родительского класса:

    DefaultOAuth2AccessToken token = super.obtainAccessToken(details, request);
    
  • Это вернет AccessToken. Теперь вам просто нужно напрямую манипулировать истекшим значением этого токена, предоставив временную метку из прошлого token.setExpiresIn(int timestamp)

Ответ 6

Если вы используете гарантию oauth2 для безопасности grails вы можете изменить только grails-app/conf/ spring/resources.groovy

import org.springframework.security.oauth2.provider.token.DefaultTokenServices

// Place your Spring DSL code here    

beans = {

  tokenServices(DefaultTokenServices){
    accessTokenValiditySeconds =  600;
    tokenStore = ref('tokenStore')
    supportRefreshToken = true;
    clientDetailsService = ref('clientDetailsService')
  }

}