AWS Cognito - Identidades autenticadas de desarrollador en JavaScript (navegador)
Tengo problemas para obtener credenciales en un script de navegador.
El servidor de autenticación devuelve cognito_identityId y cognito_token.
Luego configuré una cookie:
$ .cookie ('cognito_identityId')$ .cookie ('cognito_token')Traté de obtener credenciales de 4 maneras en el navegador, y todo falló:
CognitoIdentityCredentials
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:xxxxxxxxxxxx'
IdentityId: $.cookie('cognito_identityId'),
Logins: {
'myauth': $.cookie('cognito_token')
}
});
// => Error: falta la clave requerida 'IdentityId' en los parámetros
assumeRoleWithWebIdentity
var params = {
RoleArn: 'arn:aws:iam::xxxxxxxxxxxx:role/Cognito_xxxxxxxAuth_Role',
RoleSessionName: 'xxxxxxxxxxx',
WebIdentityToken: $.cookie('cognito_token'),
DurationSeconds: 900,
ProviderId: 'myauth'
};
var sts = new AWS.STS({apiVersion: '2011-06-15'});
sts.assumeRoleWithWebIdentity(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
// => AccessDenied: No está autorizado para realizar sts: AssumeRoleWithWebIdentity
Documento de política
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-1:xxxxxxxxxxxxx"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
}
]
}
GetCredentialsForIdentity
var params = {
IdentityId: $.cookie('cognito_identityId'),
Logins: {
"myauth": $.cookie('oauth.io_token')
}
};
var cognitoidentity = new AWS.CognitoIdentity({apiVersion: '2014-06-30'});
cognitoidentity.getCredentialsForIdentity(params, function(err, data) {
if (err) {
console.log(err, err.stack); // an error occurred
}
else {
console.log(data); // successful response
}
});
// => InvalidParameterException: proporcione un proveedor público válido
WebIdentityCredentials
AWS.config.credentials = new AWS.WebIdentityCredentials({
RoleArn: 'arn:aws:iam::xxxxxxxx:role/Cognito_xxxxxxxxxxAuth_Role',
WebIdentityToken: $.cookie('cognito_token')
});
// => Error: hubo 2 errores de validación: // * MissingRequiredParameter: falta la clave requerida 'IdentityPoolId' en los parámetros // * MissingRequiredParameter: falta la clave requerida 'IdentityId' en los parámetros
Preguntas:
¿Qué estoy haciendo mal?
¿Cuál es la forma correcta de usar esto?
Gracias.
Gracias por su amabilidad.
Escribí tu consejo, pero no cambié.
Error de mensajes.
POST https://cognito-identity.us-east-1.amazonaws.com/ 400 (Bad Request)
POST https://cognito-identity.us-east-1.amazonaws.com/ 400 (Bad Request)
Error: Missing required key 'IdentityId' in params
at fail (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:2163:37)
at validateStructure (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:2084:14)
at validateMember (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:2110:21)
at validate (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:2059:10)
at Request.VALIDATE_PARAMETERS (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:800:32)
at Request.callListeners (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:3913:20)
at callNextListener (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:3903:12)
at chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:787:9
at finish (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:126:7)
at chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:142:9
Hay un código fuente debajo del enlace.
https://github.com/bisque33/my-custom-dictionary
y el lado del servidor es una función AWS Lambda.
var aws = require('aws-sdk');
aws.config.region = 'us-east-1';
var cognitoidentity = new aws.CognitoIdentity();
var identityPoolId = 'us-east-1:0dccff0d-5fd7-4d14-b38f-d27204feaecc';
console.log('Loading function');
exports.handler = function(event, context) {
console.log('token: %s', event.token);
var params = {
IdentityPoolId: identityPoolId,
Logins: {
'oauth.io': event.token
}
};
cognitoidentity.getOpenIdTokenForDeveloperIdentity(params,function(err,data){
if(err){
console.log(err);
context.fail('Something went wrong');
}else{
context.succeed(data);
}
});
};
Este programa es Google-Chrome-Extension.
La función Lambda de AWS devuelve el token por getOpenIdTokenForDeveloperIdentity.app / scripts / popup.js llama a la función Lambda y configura las cookies.app / scripts / background.js llama a AWS.config.credentials.get y devuelve el error.¿Lo estoy usando mal?
Actualización para información adicionalGracias por la información adicional.
El error aparece en la línea 104 en background.js
AWS.config.credentials.get(function(){
y 115 líneas en background.js
dataset.synchronize(
Y, mi explicación no fue suficiente. La autenticación de Facebook necesita el dominio (por ejemplo, http: // example.com). Sin embargo, Google-Chrome-Ext no tiene dominio. Tiene un dominio 'chrome-extension: // xxxxxxxxxxxxxxxxxxxx'. Entonces, yo usohttps://oauth.io. Proxies cualquier autenticación y acepta el dominio de extensión de Chrome.
Popup.js realiza la autenticación de Facebook a través de oauth.io sdk. Obtiene un token de Facebook y le da a getOpenIdTokenForDeveloperIdentity. Creo que facebook token.substr (0,14) es único. Pero, si está mal, uso otro identificador único (por ejemplo, dirección de correo electrónico).
Lo siento estaba equivocado. AWS.config.credentials.get da un error:
Error: Invalid login token.
Y, dataset.synchronize muestra este error:
Error: Missing required key 'IdentityId' in params