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

yandex.cloud.sdk.auth.provider.ComputeEngineCredentialProvider Maven / Gradle / Ivy

package yandex.cloud.sdk.auth.provider;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import yandex.cloud.sdk.auth.IamToken;
import yandex.cloud.sdk.auth.metadata.HttpConnectionConfig;
import yandex.cloud.sdk.auth.metadata.InstanceMetadataService;

import java.io.IOException;
import java.time.Instant;

/**
 * Retrieves {@link IamToken} of service account linked to a VM. Should be executed on Yandex.Cloud VM to work correctly.
 */
public class ComputeEngineCredentialProvider implements CredentialProvider {
    /**
     * This service is responsible for communicating with metadata server
     */
    private final InstanceMetadataService metadataService;

    private ComputeEngineCredentialProvider(InstanceMetadataService metadataService) {
        this.metadataService = metadataService;
    }

    @Override
    public void close() {
        // Nothing
    }

    /**
     * Creates builder for ComputeEngineCredentialProvider
     *
     * @return {@link Builder} object
     */
    public static Builder builder() {
        return new Builder();
    }


    /**
     * @return IamToken from VM metadata
     */
    @Override
    public IamToken get() {
        try {
            return extractToken(metadataService.getValue("instance/service-accounts/default/token"));
        } catch (IOException e) {
            throw new UnavailableIamTokenException(e);
        }
    }

    /**
     * Converts string from metadata to {@link IamToken} object
     *
     * @param content metadata entry content
     * @return IamToken object created from metadata response
     * @throws IOException if an I/O exception occurs during request
     */
    private IamToken extractToken(String content) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        TokenResponse response = objectMapper.readValue(content, TokenResponse.class);
        return new IamToken(response.accessToken, Instant.now().plusSeconds(response.expiresIn));
    }

    private static class TokenResponse {
        @JsonProperty("access_token")
        private String accessToken;
        @JsonProperty("expires_in")
        private Long expiresIn;
        @JsonProperty("token_type")
        private String tokenType;
    }

    public static class Builder extends AbstractCredentialProviderBuilder {
        private InstanceMetadataService metadataService = new InstanceMetadataService();

        private Builder() {
        }

        /**
         * @param metadataServerUrl endpoint for metadata server
         * @return object itself for chained calls
         */
        public Builder metadataServerUrl(String metadataServerUrl) {
            this.metadataService = new InstanceMetadataService(HttpConnectionConfig.DEFAULT, metadataServerUrl);
            return this;
        }

        public Builder metadataService(InstanceMetadataService metadataService) {
            this.metadataService = metadataService;
            return this;
        }

        @Override
        protected CredentialProvider providerBuild() {
            return new ComputeEngineCredentialProvider(this.metadataService);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy