Я пытаюсь использовать 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/*"
}
]
}