Вызов мутации APPSYNC из Lambda с пулом Cognito - UnauthorizedException - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь вызвать мутацию из лямбды, которая регулярно запускается таймером.Это то, что я делаю

const params = {
    AccountId: "XXXXXXX",
    RoleArn: "arn:aws:iam::XXXX:role/appsync_lamda_role",     // tried removing this too
    IdentityPoolId: "ap-southeast-1:xxxx-xxxx-xxx-xxxx-xxx",
    LoginId: "demo_access" // tried with and without this
};
AWS.config.update({
    region: "ap-southeast-1",
    credentials: new AWS.CognitoIdentityCredentials(params)
});

Теперь я звоню

 AWS.config.credentials.get(err => {

    const signer = new AWS.Signers.V4(httpRequest, "appsync", true);
    signer.addAuthorization(AWS.config.credentials, AWS.util.date.getDate());


 const options = {
        method: httpRequest.method,
        body: httpRequest.body,
        headers: httpRequest.headers
    };

    fetch(uri.href, options)
        .then(res => res.json())
        .then(json => {
            console.log(`JSON Response = ${JSON.stringify(json, null, 2)}`);
            callback(null, event);
        })
        .catch(err => {
            console.error(`FETCH ERROR: ${JSON.stringify(err, null, 2)}`);
            callback(err);
        });
});

Когда я делаю это, я получаю сообщение об ошибке от APPSYNC как "ошибки": [{"errorType":"UnauthorizedException", "message": "Невозможно проанализировать токен JWT."} Я дал доступ к роли для вызова GraphQL и отредактировал доверительные отношения

 {
     "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
       },
        "Action": "sts:AssumeRoleWithWebIdentity"
    }

Чего мне здесь не хватает?Пожалуйста, помогите.

Когда я смотрю на сгенерированные заголовки, я не вижу токен JWT, но вижу сессионный токен Как

 'User-Agent': 'aws-sdk-nodejs/2.275.1 linux/v8.10.0 exec-env/AWS_Lambda_nodejs8.10',
host: 'xxxxx.appsync-api.ap-southeast-1.amazonaws.com',
'Content-Type': 'application/json',
'X-Amz-Date': '20181213T080156Z',
'x-amz-security-token': 'xxxxxx//////////xxxxxEOix8u062xxxxxynf4Q08FxxxLZxV+xx/xxx/xxx/xxxxx=',
Authorization: 'AWS4-HMAC-SHA256 Credential=xxxxxxxxx/20181213/ap-southeast-1/appsync/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=xxxxxxxxxxxxxxxxxxxxxxx' }

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы можете попробовать это:

import 'babel-polyfill';
import URL from 'url';
import fetch from 'node-fetch';
import { CognitoIdentityServiceProvider } from 'aws-sdk';

const cognitoIdentityServiceProvider = new CognitoIdentityServiceProvider({ apiVersion: '2016-04-18' });
const initiateAuth = async ({ clientId, username, password }) => cognitoIdentityServiceProvider.initiateAuth({
    AuthFlow: 'USER_PASSWORD_AUTH',
    ClientId: clientId,
    AuthParameters: {
      USERNAME: username,
      PASSWORD: password,
    },
  })
  .promise();

export const handler = async (event, context, callback) => {
  const clientId = 'YOUR_COGNITO_CLIENT_ID';
  const endPoint = 'YOUR_GRAPHQL_END_POINT_URL';
  const username = 'COGNITO_USERNAME';
  const password = 'COGNITO_PASSWORD';
  const { AuthenticationResult } = await initiateAuth({
    clientId,
    username,
    password,
  });
  const accessToken = AuthenticationResult && AuthenticationResult.AccessToken;
  const postBody = {
    query: `mutation AddUser($userId: ID!, $userDetails: UserInput!) {
        addUser(userId: $userId, userDetails: $userDetails) {
            userId
            name
        }`,
    variables: {
        userId: 'userId',
        userDetails: { name: 'name' },
    },
  };

  const uri = await URL.parse(endPoint);

  const options = {
    method: 'POST',
    body: JSON.stringify(postBody),
    headers: {
      host: uri.host,
      'Content-Type': 'application/json',
      Authorization: accessToken,
    },
  };
  const response = await fetch(uri.href, options);
  const { data } = await response.json();

  const result = data && data.addUser;
  callback(null, result);
};

Убедитесь, что ваш пул Cognito User Pool имеет USER_PASSWORD_AUTH поток аутентификации.

0 голосов
/ 14 декабря 2018

AWS AppSync поддерживает авторизацию через IAM и через Cognito User Pools.Они могут сбивать с толку, и, по моему опыту, документация и платформы AWS не помогают в этой путанице.

Аутентификация IAM - это то, что используют все основные конечные точки AWS.Вы можете создать таблицу DynamoDB с правильной аутентификацией IAM и разрешениями.Запросы IAM (часто с помощью SDK или boto) подписываются определенным хостом, путем, параметрами и заголовками с помощью вашего ключа, превращая его в подпись.Заголовок авторизации начинается с AWS4-HMAC-SHA256, поэтому похоже, что вы используете авторизацию IAM с подписью v4.

Аутентификация Cognito User Pool использует токены JWT для авторизации.После аутентификации на сервере Cognito вы получаете токен доступа и токен идентификации, которые можно использовать для вызова таких ресурсов, как AWS Appsync.Используя эти токены доступа, вы можете получить токены IAM, если подключите свой пул Cognito User Pool с пулом Cognito Identity.Если вы сделаете это, вы можете использовать эти токены для подписи запросов на аутентификацию IAM.

Похоже, вы настроили API-интерфейс AWS AppSync для аутентификации Cognito User Pool, но вызываете его с использованием аутентификации IAM.Вы можете начать вызывать его с использованием аутентификации JWT или переключить свой API-интерфейс AWS AppSync на использование аутентификации IAM.Какой метод проверки подлинности вы выберете, влияет на то, как вы можете обеспечить точный контроль доступа (в политике IAM против вашей схемы GraphQL).Подробнее об этом читайте в документах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...