package org.apereo.cas.authentication; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; /** * Describes a one-time-password credential that contains an optional unique identifier and required password. * The primary difference between this component and {@link UsernamePasswordCredential} is that the username/ID is optional * in the former and requisite in the latter. * <p> * This class implements {@link CredentialMetaData} since the one-time-password is safe for long-term storage after * authentication. Note that metadata is stored only _after_ authentication, at which time the OTP has already * been consumed and by definition is no longer useful for authentication. * * @author Marvin S. Addison * @since 4.0.0 */ public class OneTimePasswordCredential extends AbstractCredential { /** Serialization version marker. */ private static final long serialVersionUID = 1892587671827699709L; /** One-time password. */ private String password; /** Optional unique identifier. */ private String id; /** * Creates a one-time-password with just a password. * * @param password Non-null cleartext one-time password value. */ public OneTimePasswordCredential(final String password) { if (password == null) { throw new IllegalArgumentException("One-time password cannot be null."); } this.password = password; } /** * Creates a one-time-password with unique ID and password. * * @param id Identifier that is commonly used to look up one-time password in system of record. * @param password Non-null cleartext one-time password value. */ @JsonCreator public OneTimePasswordCredential(@JsonProperty("id") final String id, @JsonProperty("password") final String password) { this(password); this.id = id; } /** * Gets the cleartext one-time password value. * * @return Non-null one-time password. */ public String getPassword() { return this.password; } /** * Gets the unique ID commonly used to look up a one-time password in a system of record. * * @return Possibly null unique ID. */ @Override public String getId() { return this.id; } }