AWS Cognito - Entwicklerauthentifizierte Identitäten in JavaScript (Browser)
Ich habe Probleme, Anmeldeinformationen in einem Browserskript abzurufen.
Der Authentifizierungsserver gibt cognito_identityId und cognito_token zurück.
Dann habe ich ein Cookie gesetzt:
$. cookie ('cognito_identityId') $. cookie ('cognito_token')Ich habe auf vier Arten versucht, Anmeldeinformationen für den Browser abzurufen. Alle fehlgeschlagen:
CognitoIdentityCredentials
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:xxxxxxxxxxxx'
IdentityId: $.cookie('cognito_identityId'),
Logins: {
'myauth': $.cookie('cognito_token')
}
});
// => Fehler: Fehlender erforderlicher Schlüssel 'IdentityId' in params
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: Keine Berechtigung zum Ausführen von sts: AssumeRoleWithWebIdentity
Richtliniendokumen
{
"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: Bitte geben Sie einen gültigen öffentlichen Anbieter an
WebIdentityCredentials
AWS.config.credentials = new AWS.WebIdentityCredentials({
RoleArn: 'arn:aws:iam::xxxxxxxx:role/Cognito_xxxxxxxxxxAuth_Role',
WebIdentityToken: $.cookie('cognito_token')
});
// => Fehler: Es gab 2 Validierungsfehler: // * MissingRequiredParameter: Fehlender erforderlicher Schlüssel 'IdentityPoolId' in den Parametern // * MissingRequiredParameter: Fehlender erforderlicher Schlüssel 'IdentityId' in den Parametern
Fragen
Was mache ich falsch
Was ist der richtige Weg, um dies zu verwenden?
Vielen Dank
Vielen Dank für Ihre Freundlichkeit
Ich habe Ihren Rat gebunden, aber nicht geändert.
Fehlermeldungen
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
Unter dem Link befindet sich der Quellcode.
https: //github.com/bisque33/my-custom-dictionar
und die Serverseite ist eine AWS Lambda-Funktion.
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);
}
});
};
Dieses Programm ist Google-Chrome-Extension.
AWS Lambda-Funktion gibt Token von getOpenIdTokenForDeveloperIdentity zurück. app / scripts / popup.js ruft die Lambda-Funktion auf und setzt Cookies. app / scripts / background.js ruft AWS.config.credentials.get auf und gibt einen Fehler zurück.Verwende ich es falsch?
Update für zusätzliche InformationenVielen Dank für die zusätzlichen Informationen.
Error erscheint in Zeile 104 auf background.js
AWS.config.credentials.get(function(){
und 115 Zeile auf background.js
dataset.synchronize(
Und meine Erklärung war nicht genug. Die Facebook-Authentifizierung benötigt die Domain (z. B. http: // example.com). Google-Chrome-Ext hat jedoch keine Domain. Es hat eine Domain 'chrome-extension: // xxxxxxxxxxxxxxxxxxxx'. Dann benutze ichhttps: //oauth.i. Es ersetzt jede Authentifizierung und akzeptiert Chrome-Domain-Erweiterungen.
Popup.js führt die Facebook-Authentifizierung über oauth.io sdk durch. Es erhält ein Facebook-Token und gibt getOpenIdTokenForDeveloperIdentity. Ich denke, Facebook token.substr (0,14) ist einzigartig. Wenn es falsch ist, verwende ich eine andere eindeutige Kennung (z. B. E-Mail-Adresse).
Entschuldige, ich lag falsch. AWS.config.credentials.get gibt einen Fehler aus:
Error: Invalid login token.
Und dataset.synchronize zeigt diesen Fehler:
Error: Missing required key 'IdentityId' in params