Ошибка проверки JWT: BAD_FORMAT - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь настроить конечные точки для облачных функций, следуя статье .

. Выполнены следующие шаги:

1) Создание облачной платформы Google(GCP) и развернул следующую облачную функцию.

export const TestPost = (async (request: any, response: any) => {
    response.send('Record created.');
});

с помощью следующей команды

gcloud functions deploy TestPost --runtime nodejs10 --trigger-http --region=asia-east2

Функция работает до сих пор.

2) РазвернитеКонтейнер ESP в Cloud Run выполняется с помощью следующей команды

gcloud config set run/region us-central1

gcloud beta run deploy CLOUD_RUN_SERVICE_NAME \
    --image="gcr.io/endpoints-release/endpoints-runtime-serverless:1.30.0" \
    --allow-unauthenticated \
    --project=ESP_PROJECT_ID

Контейнер ESP также успешно развернут.

3) Создайте документ OpenAPI, описывающий API, и настройте маршруты к функциям облака..

swagger: '2.0'
info:
    title: Cloud Endpoints + GCF
    description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
    version: 1.0.0
host: HOST
schemes:
- https
produces:
    - application/json
paths:
    /Test:
      get:
        summary: Do something
        operationId: Test
        x-google-backend:
            address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/Test
        responses:
            '200':
                description: A successful response
                schema:
                    type: string

4) Разверните документ OpenAPI с помощью следующей команды

gcloud endpoints services deploy swagger.yaml

5) Настройте ESP, чтобы он мог найти конфигурацию для службы конечных точек.

gcloud beta run configurations update \
   --service CLOUD_RUN_SERVICE_NAME  \
   --set-env-vars ENDPOINTS_SERVICE_NAME=YOUR_SERVICE_NAME \
   --project ESP_PROJECT_ID

gcloud alpha functions add-iam-policy-binding FUNCTION_NAME \
    --member "serviceAccount:ESP_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
    --role "roles/iam.cloudfunctions.invoker" \
    --project FUNCTIONS_PROJECT_ID

Это сделано успешно

6) Отправка запросов в API

Работает абсолютно нормально.

Теперь я хотел реализовать аутентификацию, поэтому я внес следующие изменения в OpenДокумент API

swagger: '2.0'
info:
    title: Cloud Endpoints + GCF
    description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
    version: 1.0.0
host: HOST
schemes:
- https
produces:
    - application/json
security:
    - client-App-1: [read, write]
paths:
    /Test:
      get:
        summary: Do something
        operationId: Test
        x-google-backend:
            address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/Test
        responses:
            '200':
                description: A successful response
                schema:
                    type: string
securityDefinitions:
    client-App-1:
        authorizationUrl: ""
        flow: "implicit"
        type: "oauth2"
        scopes:
            read: Grants read access
            write: Grants write access
        x-google-issuer: SERVICE_ACCOUNT@PROJECT.iam.gserviceaccount.com
        x-google-jwks_uri: https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT@PROJECT.iam.gserviceaccount.com

Я создал служебную учетную запись с помощью следующей команды.

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME --display-name DISPLAY_NAME

Предоставленная роль Token Creator для служебной учетной записи с использованием следующей

gcloud projects add-iam-policy-binding PROJECT_ID --member serviceAccount:SERVICE_ACCOUNT_EMAIL --role roles/iam.serviceAccountTokenCreator

Повторное развертывание OpenAPIdocument

gcloud endpoints services deploy swagger.yaml

Теперь, когда я тестирую API, я получаю следующую ошибку

{
    "code": 16,
    "message": "JWT validation failed: BAD_FORMAT",
    "details": [
        {
            "@type": "type.googleapis.com/google.rpc.DebugInfo",
            "stackEntries": [],
            "detail": "auth"
        }
    ] }

Я передаю токен доступа, сгенерированный через gcloud, в запрос, используя BearerToken

cmdдля генерации токена доступа это gcloud auth application-default print-access-token

Может кто-нибудь указать, в чем здесь проблема.Спасибо ...

Редактировать # 1: Я использую Postman для подключения к моему API

После использования следующей команды я получаю другую ошибку.

Команда:

gcloud auth print-identity-token SERVICE_ACCOUNT_EMAIL

Ошибка:

{
    "code": 16,
    "message": "JWT validation failed: Issuer not allowed",
    "details": [
        {
            "@type": "type.googleapis.com/google.rpc.DebugInfo",
            "stackEntries": [],
            "detail": "auth"
        }
    ]
}

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Для ESP вы должны использовать токен jwt или токен идентификации. не доступ к токену. Пожалуйста, проверьте это .

0 голосов
/ 14 июня 2019

Наконец-то я менеджер, чтобы решить эту проблему.

Две вещи были неправильными.

1) Формат необработанного токена JWT должен быть следующим:

{
    "iss": SERVICE_ACCOUNT_EMAIL,
    "iat": 1560497345,
    "aud": ANYTHING_WHICH_IS_SAME_AS_IN_OPENAPI_YAML_FILE,
    "exp": 1560500945,
    "sub": SERVICE_ACCOUNT_EMAIL
}

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

gcloud beta iam service-accounts sign-jwt --iam-account SERVICE_ACCOUNT_EMAIL raw-jwt.json signed-jwt.json

2) Определение безопасности в файле YAML должно выглядеть следующим образом:

securityDefinitions:
  client-App-1:
    authorizationUrl: ""
    flow: "implicit"
    type: "oauth2"
    scopes:
      read: Grants read access
      write: Grants write access
    x-google-issuer: SERVICE_ACCOUNT_EMAIL 
    x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL
    x-google-audiences: ANYTHING_BUT_SAME_AS_IN_RAW_JWT_TOKEN
...