AutenticazioneToken.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.pdd.core.autenticazione.pd;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.autenticazione.AutenticazioneException;
import org.openspcoop2.pdd.core.token.InformazioniToken;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
/**
* Classe che implementa una autenticazione token
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class AutenticazioneToken extends AbstractAutenticazioneBase {
private boolean logError = true;
@Override
public void setLogError(boolean logError) {
this.logError = logError;
}
private String tokenPolicy = null;
private String clientId = null;
private void readDati(DatiInvocazionePortaDelegata datiInvocazione) {
if(this.clientId==null) {
InformazioniToken informazioniTokenNormalizzate = null;
if(this.getPddContext()!=null && this.getPddContext().containsKey(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE)) {
informazioniTokenNormalizzate = (InformazioniToken) this.getPddContext().getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
}
if(informazioniTokenNormalizzate==null) {
return;
}
this.clientId = informazioniTokenNormalizzate.getClientId();
if(this.clientId==null || StringUtils.isEmpty(this.clientId)) {
return;
}
}
if(this.tokenPolicy==null) {
if(datiInvocazione.getPd()!=null) {
if(datiInvocazione.getPd().getGestioneToken()!=null) {
this.tokenPolicy = datiInvocazione.getPd().getGestioneToken().getPolicy();
if(this.tokenPolicy==null || StringUtils.isEmpty(this.tokenPolicy)) {
return;
}
}
}
}
}
public String toStringCredentials() {
if(this.clientId==null || this.tokenPolicy==null) {
return null;
}
return "TokenPolicy-"+this.tokenPolicy+".clientId:"+this.clientId;
}
@Override
public String getSuffixKeyAuthenticationResultInCache(DatiInvocazionePortaDelegata datiInvocazione) {
readDati(datiInvocazione);
return toStringCredentials();
}
@Override
public EsitoAutenticazionePortaDelegata process(DatiInvocazionePortaDelegata datiInvocazione) throws AutenticazioneException{
EsitoAutenticazionePortaDelegata esito = new EsitoAutenticazionePortaDelegata();
if(datiInvocazione==null) {
throw new AutenticazioneException("Param datiInvocazione is null");
}
readDati(datiInvocazione);
if(this.clientId==null || this.tokenPolicy==null) {
// Nella richiesta non vi sono dati utili all'autenticazione token
esito.setClientAuthenticated(false);
esito.setClientIdentified(false);
esito.setNoCache(true);
return esito;
}
IDSoggetto soggettoFruitore = null;
if(datiInvocazione!=null && datiInvocazione.getPd()!=null) {
soggettoFruitore = new IDSoggetto(datiInvocazione.getPd().getTipoSoggettoProprietario(), datiInvocazione.getPd().getNomeSoggettoProprietario());
}
// Essendoci l'identita' del chiamante, il client e' stato autenticato tramite il token
esito.setClientAuthenticated(true);
esito.setCredential(toStringCredentials());
IDServizioApplicativo idServizioApplicativo = null;
try {
ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(datiInvocazione.getState());
idServizioApplicativo = configurazionePdDManager.getIdServizioApplicativoByCredenzialiToken(this.tokenPolicy, this.clientId);
}
catch(Exception e){
if(this.logError) {
OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error("AutenticazioneToken non riuscita",e);
}
esito.setErroreIntegrazione(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE));
esito.setClientAuthenticated(false);
esito.setClientIdentified(false);
esito.setEccezioneProcessamento(e);
return esito;
}
if(idServizioApplicativo == null){
// L'identificazione token non e' obbligatoria
// esito.setErroreCooperazione(ErroriCooperazione.AUTENTICAZIONE_FALLITA_CREDENZIALI_FORNITE_NON_CORRETTE.getErroreCooperazione());
esito.setClientIdentified(false);
return esito;
}
else {
if(OpenSPCoop2Properties.getInstance().isAutenticazioneTokenPortaDelegataCheckSoggettiProprietari() && idServizioApplicativo.getIdSoggettoProprietario().equals(soggettoFruitore)==false) {
esito.setErroreIntegrazione(IntegrationFunctionError.AUTHENTICATION_INVALID_CREDENTIALS,
ErroriIntegrazione.ERRORE_402_AUTENTICAZIONE_FALLITA.
getErrore402_AutenticazioneFallitaToken("soggetto proprietario ("+idServizioApplicativo.getIdSoggettoProprietario()+") dell'applicativo token identificato ("+idServizioApplicativo.getNome()+") differente dal soggetto proprietario della porta invocata ("+soggettoFruitore+")",this.clientId));
esito.setClientIdentified(false);
return esito;
}
else {
esito.setClientIdentified(true);
esito.setIdServizioApplicativo(idServizioApplicativo);
}
}
return esito;
}
}