001
002package io.vrap.rmf.base.client.oauth2;
003
004import java.net.URI;
005import java.nio.charset.StandardCharsets;
006import java.util.Base64;
007
008import io.vrap.rmf.base.client.*;
009
010/**
011 * Token supplier using password flow
012 */
013public class GlobalCustomerPasswordTokenSupplier extends BaseAuthTokenSupplier implements TokenSupplier {
014
015    public GlobalCustomerPasswordTokenSupplier(final String clientId, final String clientSecret, final String email,
016            final String password, final String scope, final String tokenEndpoint,
017            final VrapHttpClient vrapHttpClient) {
018        super(vrapHttpClient, constructApiHttpRequest(clientId, clientSecret, email, password, scope, tokenEndpoint));
019    }
020
021    private static ApiHttpRequest constructApiHttpRequest(final String clientId, final String clientSecret,
022            final String email, final String password, final String scope, final String tokenEndpoint) {
023        String auth = Base64.getEncoder()
024                .encodeToString((clientId + ":" + clientSecret).getBytes(StandardCharsets.UTF_8));
025
026        final String body;
027        if (scope == null || scope.isEmpty()) {
028            body = String.format("grant_type=password&username=%s&password=%s", urlEncode(email), urlEncode(password));
029        }
030        else {
031            body = String.format("grant_type=password&username=%s&password=%s&scope=%s", urlEncode(email),
032                urlEncode(password), urlEncode(scope));
033        }
034        ApiHttpHeaders apiHttpHeaders = new ApiHttpHeaders()
035                .withHeader("Authorization", String.format("Basic %s", auth))
036                .withHeader("Content-Type", "application/x-www-form-urlencoded");
037        return new ApiHttpRequest(ApiHttpMethod.POST, URI.create(tokenEndpoint), apiHttpHeaders,
038            body.getBytes(StandardCharsets.UTF_8));
039    }
040}