All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zalando.riptide.spring.AccessTokensFactoryBean Maven / Gradle / Ivy

package org.zalando.riptide.spring;

import org.springframework.beans.factory.config.AbstractFactoryBean;
import org.zalando.riptide.spring.RiptideSettings.Client.OAuth;
import org.zalando.riptide.spring.RiptideSettings.Defaults;
import org.zalando.riptide.spring.RiptideSettings.GlobalOAuth;
import org.zalando.stups.tokens.AccessTokens;
import org.zalando.stups.tokens.AccessTokensBuilder;
import org.zalando.stups.tokens.JsonFileBackedClientCredentialsProvider;
import org.zalando.stups.tokens.JsonFileBackedUserCredentialsProvider;
import org.zalando.stups.tokens.Tokens;

import javax.annotation.Nullable;
import java.net.URI;
import java.nio.file.Path;
import java.util.concurrent.TimeUnit;

import static com.google.common.base.Preconditions.checkArgument;

final class AccessTokensFactoryBean extends AbstractFactoryBean {

    private AccessTokensBuilder builder;

    AccessTokensFactoryBean(final RiptideSettings settings) {
        final Defaults defaults = settings.getDefaults();
        final GlobalOAuth oAuth = settings.getOauth();

        final URI accessTokenUrl = getAccessTokenUrl(oAuth);
        @Nullable final Path directory = oAuth.getCredentialsDirectory();
        final TimeSpan connectTimeout = oAuth.getConnectTimeout();
        final TimeSpan socketTimeout = oAuth.getSocketTimeout();

        this.builder = Tokens.createAccessTokensWithUri(accessTokenUrl)
                .usingClientCredentialsProvider(getClientCredentialsProvider(directory))
                .usingUserCredentialsProvider(getUserCredentialsProvider(directory))
                .schedulingPeriod((int) oAuth.getSchedulingPeriod().getAmount())
                .schedulingTimeUnit(oAuth.getSchedulingPeriod().getUnit())
                .connectTimeout((int) connectTimeout.to(TimeUnit.MILLISECONDS))
                .socketTimeout((int) socketTimeout.to(TimeUnit.MILLISECONDS));

        settings.getClients().forEach((id, client) -> {
            @Nullable final OAuth clientOAuth = client.getOauth();

            if (clientOAuth == null) {
                return;
            }

            builder.manageToken(id)
                    .addScopesTypeSafe(clientOAuth.getScopes())
                    .done();
        });
    }

    private JsonFileBackedClientCredentialsProvider getClientCredentialsProvider(@Nullable final Path directory) {
        return directory == null ?
                new JsonFileBackedClientCredentialsProvider() :
                new JsonFileBackedClientCredentialsProvider(directory.resolve("client.json").toFile());
    }

    private JsonFileBackedUserCredentialsProvider getUserCredentialsProvider(@Nullable final Path directory) {
        return directory == null ?
                new JsonFileBackedUserCredentialsProvider() :
                new JsonFileBackedUserCredentialsProvider(directory.resolve("user.json").toFile());
    }

    private URI getAccessTokenUrl(final GlobalOAuth oauth) {
        @Nullable final URI accessTokenUrl = oauth.getAccessTokenUrl();

        checkArgument(accessTokenUrl != null, "" +
                "Neither 'riptide.oauth.access-token-url' nor 'ACCESS_TOKEN_URL' was set, " +
                "but at least one client requires OAuth");

        return accessTokenUrl;
    }

    @Override
    protected AccessTokens createInstance() throws Exception {
        return builder.start();
    }

    @Override
    public Class getObjectType() {
        return AccessTokens.class;
    }

    @Override
    protected void destroyInstance(final AccessTokens tokens) throws Exception {
        tokens.stop();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy