/* ******************************************************************************
 * Copyright (c) 2020 Stephane Bastian
 *
 * This program and the accompanying materials are made available under the 2
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0 3
 *
 * Contributors: 4
 *   Stephane Bastian - initial API and implementation
 ********************************************************************************/
package io.vertx.ext.auth.authentication;

import io.vertx.codegen.annotations.DataObject;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.json.JsonObject;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

Credentials used by any AuthenticationProvider that requires tokens, for example JWT, Oauth2, OpenId Connect
Author:Paulo Lopes
/** * Credentials used by any {@link AuthenticationProvider} that requires tokens, for example JWT, Oauth2, OpenId Connect * * @author Paulo Lopes */
@DataObject(generateConverter = true, publicConverter = false) public class UsernamePasswordCredentials implements Credentials { private String password; private String username; protected UsernamePasswordCredentials() { } public UsernamePasswordCredentials(String username, String password) { setUsername(username); setPassword(password); } public UsernamePasswordCredentials(JsonObject jsonObject) { UsernamePasswordCredentialsConverter.fromJson(jsonObject, this); } public String getPassword() { return password; } public String getUsername() { return username; } public UsernamePasswordCredentials setPassword(String password) { this.password = password; return this; } public UsernamePasswordCredentials setUsername(String username) { this.username = username; return this; } @Override public <V> void checkValid(V arg) throws CredentialValidationException { if (username == null || username.length() == 0) { throw new CredentialValidationException("username cannot be null or empty"); } // passwords are allowed to be empty // for example this is used by basic auth if (password == null) { throw new CredentialValidationException("password cannot be null"); } } public JsonObject toJson() { JsonObject result = new JsonObject(); UsernamePasswordCredentialsConverter.toJson(this, result); return result; } @Override public String toString() { return toJson().encode(); } @Override public UsernamePasswordCredentials applyHttpChallenge(String challenge, HttpMethod method, String uri, Integer nc, String cnonce) throws CredentialValidationException { if (challenge != null) { int spc = challenge.indexOf(' '); if (!"Basic".equalsIgnoreCase(challenge.substring(0, spc))) { throw new IllegalArgumentException("Only 'Basic' auth-scheme is supported"); } } // validate checkValid(null); return this; } @Override public String toHttpAuthorization() { String credentials = (username == null ? "" : username) + ":" + (password == null ? "" : password); return "Basic " + Base64.getEncoder().encodeToString(credentials.getBytes(StandardCharsets.UTF_8)); } }