Как получить доступ к API AppSync с помощью настраиваемой федеративной идентичности - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь использовать AWS AppSync API, используя федеративные удостоверения с настраиваемой ролью, прошедшей проверку подлинности, но безуспешно.

Сначала я последовал этому обучению , чтобы создать своего клиента. Затем я открыл консоль федеративных удостоверений -> Изменить пул удостоверений -> Пользовательский и создал Developer provider name: login.mycompany.myapp и проверил Enable access to unauthenticated identities.

После этого я следовал этому одному , чтобы узнать, как создать пользовательскую аутентификацию.

Как только вы получите идентификационный идентификатор и токен сеанса от своего бэкэнда, Вы будете передавать их в AWS.CognitoIdentityCredentials поставщик. Вот пример:

AWS.config.credentials = new AWS.CognitoIdentityCredentials({   
    IdentityPoolId: 'IDENTITY_POOL_ID',    
    IdentityId: 'IDENTITY_ID_RETURNED_FROM_YOUR_PROVIDER',
    Logins: {
        'cognito-identity.amazonaws.com': 'TOKEN_RETURNED_FROM_YOUR_PROVIDER'    
    }
});

Как я могу получить IDENTITY_ID_RETURNED_FROM_YOUR_PROVIDER, cognito-identity.amazonaws.com и IDENTITY_ID_RETURNED_FROM_YOUR_PROVIDER? Я видел, как это сделать:

Вы получаете токен, вызывая GetOpenIdTokenForDeveloperIdentity. Этот API должен вызываться из вашего бэкэнда с использованием учетных данных разработчика AWS.

Я проверил GetOpenIdTokenForDeveloperIdentity документацию и создал этот фрагмент кода:

const AWS = require('aws-sdk');
AWS.config.region = 'us-east-1'; // Region

const cognitoidentity = new AWS.CognitoIdentity();

const params = {
    IdentityPoolId: IDENTITY_POOL_ID',
    Logins: {
        'login.mycompany.myapp': 'sometoken',
    },
};

cognitoidentity.getOpenIdTokenForDeveloperIdentity(params, function(
    err,
    { IdentityId, Token }
) {
    if (err) {
        console.log(err);
    }
    console.log(IdentityId, Token);
}

Я получил IdentityId и Token. Я взял эти переменные и создал клиент Cognito следующим образом:

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: IDENTITY_POOL_ID,
    IdentityId: IdentityId,
    Logins: {
        'cognito-identity.amazonaws.com': Token,
    },
});

const credentials = AWS.config.credentials;

const AWSAppSyncClient = require('aws-appsync').default;
const AUTH_TYPE = require('aws-appsync/lib/link/auth-link').AUTH_TYPE;

// Set up Apollo client
const client = new AWSAppSyncClient({
    url: GRAPHQL_API_URL,
    region: REGION,
    auth: {
        type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
        credentials: credentials,
    },
});

Теперь, когда я делаю запрос

client.hydrated().then(function(client) {
    //Now run a query
    client
        .query({ query: query })
        .then(function logData(data) {
            console.log('results of query: ', data);
        })
        .catch(console.error);
});

Я получаю ошибку: Network error: Response not successful: Received status code 401. Мне не хватает какой-то конфигурации?

Спасибо!

Редактировать : В федеративных удостоверениях я установил Unauthenticated role и Authenticated role следующим образом:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "appsync:GraphQL",
                "mobileanalytics:PutEvents",
                "cognito-sync:*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "appsync:GraphQL",
            "Resource": "arn:aws:appsync:*:*:apis/*/types/*/fields/*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "appsync:GraphQL",
            "Resource": "arn:aws:appsync:*:*:apis/*"
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...