Как сгенерировать токен JWT с помощью Prisma API?

Я использую prisma для работы с GraphQL. . Я знаю, что есть способ защитить сервер graphql секретным ключом. Например, при указании секретного ключа как:

secret: my-secret-42

в prisma.yml, а затем запуск prisma deploy обеспечит защиту сервера graphql, и для всех последующих запросов потребуется токен JWT для доступа к нему.

Я могу сгенерировать токен JWT с помощью команды

prisma token

Это дает мне токен, и, передав его в заголовках, я могу получить к нему доступ. Но есть ли API, с помощью которого я мог бы сгенерировать токен, и мне не нужно вручную запускать команду prisma token в CLI.

Я хочу, чтобы javascript имел прямой доступ к GraphQL через запросы. Для этого мне нужна какая-то форма аутентификации. Поскольку приложение будет использовать несколько пользователей, я хочу иметь разные токены для разных пользователей. Поэтому я ищу способ сгенерировать токен с помощью API, если он доступен в Prisma.


person Amanda    schedule 30.01.2020    source источник


Ответы (1)


Маркер службы - это простой токен JWT, который можно легко создать, используя имя службы и сценическое имя, а также секрет. Вы можете сами создать токен и прикрепить его. Взгляните на реальный код, который использует prisma CLI:

  getToken(serviceName: string, stageName: string): string | undefined {
    if (this.secrets) {
      const data = {
        data: {
          service: `${serviceName}@${stageName}`,
          roles: ['admin'],
        },
      }
      return jwt.sign(data, this.secrets[0], {
        expiresIn: '7d',
      })
    }

    return undefined
  }

Источник: https://github.com/prisma/prisma/blob/master/cli/packages/prisma-yml/src/PrismaDefinition.ts

Дополнительная информация о структуре:

Токены службы соответствуют спецификации JSON Web Token (JWT) (RFC 7519):

«Веб-токен JSON (JWT) - это компактное, безопасное для URL-адресов средство представления утверждений, передаваемых между двумя сторонами. Заявления в JWT кодируются как объект JSON, который используется в качестве полезной нагрузки веб-подписи JSON (JWS). структуры или в виде открытого текста структуры JSON Web Encryption (JWE), что позволяет утверждать цифровую подпись или защищать целостность с помощью кода аутентификации сообщения (MAC) и / или зашифровывать ».

JWT состоит из трех компонентов:

Заголовок: Заголовок обычно состоит из двух частей: типа токена, то есть JWT, и используемого алгоритма хеширования (HS256 в случае сервисных токенов Prisma).

{   "alg": "HS256",   "typ": "JWT" } 

Полезная нагрузка: полезная нагрузка содержит утверждения. Утверждения - это утверждения о сущности (обычно, о пользователе) и дополнительных данных. Вот как это выглядит для службы под названием demo, развернутой на этапе разработки:

{   
   "data": {
      "service": "demo@dev",
      "roles": ["admin"]   
   },   
   "iat": 1532530208,   
   "exp": 1533135008 
} 

Подпись: подпись используется для проверки того, что сообщение не было изменено в процессе. Чтобы создать часть подписи, вы должны взять закодированный заголовок, закодированную полезную нагрузку, секрет, алгоритм, указанный в заголовке, и подписать его. Например, если вы хотите использовать алгоритм HMAC SHA256, подпись будет создана следующим образом:

HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret) 

Следовательно, JWT обычно выглядит так: xxxxx.yyyyy.zzzzz

Источник: https://www.prisma.io/docs/prisma-server/authentication-and-security-kke4/#service-token

person realAlexBarge    schedule 03.02.2020
comment
Знаете ли вы, как указать имя службы и сценическое имя с помощью prisma? Это нужно сделать в yml? - person Amanda; 05.02.2020
comment
Сервис и этап могут быть определены в переменной среды вашей конечной точки prisma, например PRISMA_ENDPOINT="http://localhost:4466/SERVICE/STAGE". См. prisma.io/docs/ понять-prisma / в разделе Подробнее о конечных точках сервисов Prisma. - person realAlexBarge; 05.02.2020