/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cxf.rs.security.oauth2.common; import java.io.Serializable; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.MapKeyColumn; import javax.persistence.OneToOne; import javax.persistence.OrderColumn; /** * Represents a registered third-party Client application */ @Entity public class Client implements Serializable { private static final long serialVersionUID = -5550840247125850922L; private String clientId; private String clientSecret; private String clientIpAddress; private String applicationName; private String applicationDescription; private String applicationWebUri; private String applicationLogoUri; private String applicationLogoutUri; private List<String> applicationCertificates = new LinkedList<String>(); private List<String> redirectUris = new LinkedList<String>(); private boolean isConfidential; private List<String> allowedGrantTypes = new LinkedList<String>(); private List<String> registeredScopes = new LinkedList<String>(); private List<String> registeredAudiences = new LinkedList<String>(); private Map<String, String> properties = new HashMap<>(); private UserSubject subject; private UserSubject resourceOwnerSubject; private long registeredAt; private String homeRealm; private boolean registeredDynamically; private String tokenEndpointAuthMethod; public Client() { } public Client(String clientId, String clientSecret, boolean isConfidential) { this.clientId = clientId; this.clientSecret = clientSecret; this.isConfidential = isConfidential; } public Client(String clientId, String clientSecret, boolean isConfidential, String applicationName) { this(clientId, clientSecret, isConfidential); this.applicationName = applicationName; } public Client(String clientId, String clientSecret, boolean isConfidential, String applicationName, String applicationWebUri) { this(clientId, clientSecret, isConfidential, applicationName); this.applicationWebUri = applicationWebUri; } /** * Get the client registration id * @return the consumer key */ @Id public String getClientId() { return clientId; } public void setClientId(String id) { clientId = id; } /** * Get the client secret * @return the consumer key */ public String getClientSecret() { return clientSecret; } public void setClientSecret(String id) { clientSecret = id; } /** * Get the name of the third-party application * this client represents * @return the application name */ public String getApplicationName() { return applicationName; } /** * Set the name of the third-party application * this client represents * @param applicationName the name */ public void setApplicationName(String applicationName) { this.applicationName = applicationName; } /** * Get the public URI of the third-party application. * @return the application URI */ public String getApplicationWebUri() { return applicationWebUri; } /** * Set the public URI of the third-party application. * @param applicationWebUri the application URI */ public void setApplicationWebUri(String applicationWebUri) { this.applicationWebUri = applicationWebUri; } /** * Get the description of the third-party application. * @return the application description */ public String getApplicationDescription() { return applicationDescription; } /** * Set the description of the third-party application. * @param applicationDescription the description */ public void setApplicationDescription(String applicationDescription) { this.applicationDescription = applicationDescription; } /** * Get the URI pointing to a logo image of the client application * @return the logo URI */ public String getApplicationLogoUri() { return applicationLogoUri; } /** * Set the URI pointing to a logo image of the client application * @param logoPath the logo URI */ public void setApplicationLogoUri(String logoPath) { this.applicationLogoUri = logoPath; } /** * Get the confidentiality status of this client application. * @return the confidentiality status */ public boolean isConfidential() { return isConfidential; } /** * Set the confidentiality status of this client application. * This can be used to restrict which OAuth2 flows this client * can participate in. * * @param isConf true if the client is confidential */ public void setConfidential(boolean isConf) { this.isConfidential = isConf; } /** * Get a list of URIs the AuthorizationService * may return the authorization code to * @return the redirect uris */ @ElementCollection(fetch = FetchType.EAGER) @OrderColumn public List<String> getRedirectUris() { return redirectUris; } /** * Sets a list of URIs the AuthorizationService * may return the authorization code to. * @param redirectUris the redirect uris */ public void setRedirectUris(List<String> redirectUris) { this.redirectUris = redirectUris; } /** * Get the list of access token grant types this client * can use to obtain the access tokens. * @return the list of grant types */ @ElementCollection(fetch = FetchType.EAGER) @OrderColumn public List<String> getAllowedGrantTypes() { return allowedGrantTypes; } /** * Set the list of access token grant types this client * can use to obtain the access tokens. * @param allowedGrantTypes the list of grant types */ public void setAllowedGrantTypes(List<String> allowedGrantTypes) { this.allowedGrantTypes = allowedGrantTypes; } /** * Get the {@link UserSubject} representing this Client * authentication * @return the user subject */ @OneToOne public UserSubject getSubject() { return subject; } /** * Set the {@link UserSubject} representing this Client * authentication. This property may be set during the registration * in cases where a 3rd party client needs to authenticate first before * registering as OAuth2 client. This property may also wrap a clientId * in cases where a client credentials flow is used * * @param subject the user subject */ public void setSubject(UserSubject subject) { this.subject = subject; } /** * Get the {@link UserSubject} representing the resource owner * who has registered this client * @return the resource owner user subject */ @ManyToOne public UserSubject getResourceOwnerSubject() { return resourceOwnerSubject; } /** * Set the {@link UserSubject} representing the resource owner * who has registered this client. This property may be set in cases where * each account (resource) owner registers account specific Clients * * @param resourceOwnerSubject the resource owner user subject */ public void setResourceOwnerSubject(UserSubject resourceOwnerSubject) { this.resourceOwnerSubject = resourceOwnerSubject; } /** * Get the list of additional client properties * @return the list of properties */ @ElementCollection(fetch = FetchType.EAGER) @MapKeyColumn(name = "name") public Map<String, String> getProperties() { return properties; } /** * Set the list of additional client properties * @param properties the properties */ public void setProperties(Map<String, String> properties) { this.properties = properties; } /** * Get the list of registered scopes * @return scopes */ @ElementCollection(fetch = FetchType.EAGER) @OrderColumn public List<String> getRegisteredScopes() { return registeredScopes; } /** * Set the list of registered scopes. * Registering the scopes will allow the clients not to include the scopes * and delegate to the runtime to enforce that the current request scopes are * a subset of the pre-registered scopes. * * Client Registration service is expected to reject unknown scopes. * @param registeredScopes the scopes */ public void setRegisteredScopes(List<String> registeredScopes) { this.registeredScopes = registeredScopes; } @ElementCollection(fetch = FetchType.EAGER) @OrderColumn public List<String> getRegisteredAudiences() { return registeredAudiences; } /** * Set the list of registered audiences * @param registeredAudiences audiences */ public void setRegisteredAudiences(List<String> registeredAudiences) { this.registeredAudiences = registeredAudiences; } @ElementCollection(fetch = FetchType.EAGER) @OrderColumn public List<String> getApplicationCertificates() { return applicationCertificates; } /* * Set the Base64 encoded Application Public X509 Certificate * It can be used in combination with the clientSecret property to support * Basic or other password-aware authentication on top of 2-way TLS. */ public void setApplicationCertificates(List<String> applicationCertificates) { this.applicationCertificates = applicationCertificates; } public String getClientIpAddress() { return clientIpAddress; } public void setClientIpAddress(String clientIpAddress) { this.clientIpAddress = clientIpAddress; } public long getRegisteredAt() { return registeredAt; } public void setRegisteredAt(long registeredAt) { this.registeredAt = registeredAt; } public String getHomeRealm() { return homeRealm; } /** * Hint to the authentication system how the users * redirected by this client need to be authenticated * @param homeRealm user home realm */ public void setHomeRealm(String homeRealm) { this.homeRealm = homeRealm; } public boolean isRegisteredDynamically() { return registeredDynamically; } public void setRegisteredDynamically(boolean registeredDynamically) { this.registeredDynamically = registeredDynamically; } public String getApplicationLogoutUri() { return applicationLogoutUri; } public void setApplicationLogoutUri(String applicationLogoutUri) { this.applicationLogoutUri = applicationLogoutUri; } public String getTokenEndpointAuthMethod() { return tokenEndpointAuthMethod; } public void setTokenEndpointAuthMethod(String tokenEndpointAuthMethod) { this.tokenEndpointAuthMethod = tokenEndpointAuthMethod; } }