Как сгенерировать токен JWT с помощью Prisma API? - PullRequest
0 голосов
/ 30 января 2020

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

secret: my-secret-42

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

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

prisma token

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

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

1 Ответ

1 голос
/ 03 февраля 2020

Сервисный токен - это простой токен JWT, который можно легко создать с помощью службы и сценического имени, а также секрета. Вы можете создать токен самостоятельно и прикрепить его. Взгляните на фактический код, который использует призма 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) (RF C 7519):

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

JWT имеет следующие три компонента:

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

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

Payloa d: полезная нагрузка содержит претензии. Претензии - это заявления о сущности (обычно о пользователе) и дополнительные данные. Вот как это выглядит для службы под названием 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 - токен

...