2015-09-16 9 views
6

Autentico tramite Cognito sul browser lato client utilizzando un'identità autenticata dallo sviluppatore. Quando la mia pagina viene caricata (o aggiornata) vorrei che la mia applicazione ricordasse l'identità per tutto il tempo in cui l'oggetto non è scaduto (credo che duri circa un'ora). Tuttavia, non so come recuperare l'identità da Cognito senza dover ricorrere nuovamente all'autenticazione dello sviluppatore.Come mantenere l'identità di Cognito tra le pagine nel browser

Ecco cosa fa il codice a pagina carico:

var cognitoCredentials 

$(document).ready(function() { 
    "use strict"; 

    cognitoParams = { 
     IdentityPoolId: 'us-east-1:xxxxxxx' 
    }; 

    cognitoCredentials = new AWS.CognitoIdentityCredentials(cognitoParams); 
    AWS.config.credentials = cognitoCredentials; 

}); 

E dopo l'accesso attraverso l'autenticazione sviluppatore:

cognitoCredentials.params.IdentityId = output.identityId; 
cognitoCredentials.params.Logins = { 
    'cognito-identity.amazonaws.com': output.token 
}; 
cognitoCredentials.expired = true; 

Se ho già effettuato l'accesso, e quindi aggiornare la pagina, e provo ad accedere nuovamente Ricevo un errore che sto cercando di ottenere un'identità quando ne ho già uno Error: Missing credentials in config(…) NotAuthorizedException: Missing credentials in config "Access to Identity 'us-east-1:91fa684a-3d30-4b38-8705-450f10f086af' is forbidden."

Tuttavia, non so come accedervi. Come posso recuperare le credenziali in modo che quando la pagina viene aggiornata, posso rilevare l'identità precedente fornita da Cognito?

risposta

2

L'unico modo per tornare alla stessa identità all'aggiornamento della pagina sarebbe utilizzare lo stesso token utilizzato per inizializzare tale identità. Si consiglia di fare riferimento a this question in quanto i problemi sono simili (sostituendo il token di Facebook con il token OpenId Connect dal flusso di identità autenticato dallo sviluppatore).

Per ripetere ciò che dice questa domanda: le credenziali nell'SDK non verranno mantenute tra le pagine, quindi è necessario memorizzare nella cache il token da riutilizzare.

+2

C'è una best practice per la memorizzazione nella cache il token in modo che scade automaticamente? Dovrei usare sessionStorage invece di localStorage, ad esempio? – JBaczuk

+1

Nella lettura sembra che la memorizzazione del browser o i cookie siano le opzioni e ciascuno di essi ha pro e contro: https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/ – JBaczuk

7

Salvare almeno accessKeyId, secretAccessKey, sessionToken in sessionStorage tra le pagine. Puoi caricarli in AWS.config.credentials (dopo che l'SDK di AWS è stato caricato, ovviamente). È molto più veloce di aspettare che Cognito risponda. Tieni presente che dovrai aggiornarli manualmente con un token da uno dei provider e questo è valido solo fino alla scadenza del token temporaneo (~ 1 ora).

var credKeys = [ 
 
    'accessKeyId', 
 
    'secretAccessKey', 
 
    'sessionToken' 
 
]; 
 

 
// After Cognito login 
 
credKeys.forEach(function(key) { 
 
    sessionStorage.setItem(key, AWS.config.credentials[key]); 
 
}); 
 

 
// After AWS SDK load 
 

 
AWS.config.region = 'us-east-1'; // pick your region 
 

 
credKeys.forEach(function(key) { 
 
    AWS.config.credentials[key] = sessionStorage.getItem(key); 
 
}); 
 

 
// Now make your AWS calls to S3, DynamoDB, etc

+0

abbiamo avuto il caching, quindi lo abbiamo rimosso, e ora probabilmente lo aggiungerò di nuovo. Il cognito impiega circa 2 secondi (in media) per passare dal token fornitore a quello che è inutilizzabile in qualsiasi scenario multipagina. Vorrei che questo fosse supportato solo dal sdk. –

Problemi correlati