Рейтинг:1

GraphQL query to validate User Login

флаг cn

I'm working on the Drupal decoupled project, where the client is VueJs and the backend is Drupal 9. I'm using Drupal's contrib module GraphQL 8.x-3.1 for the interaction between client and server. I'm new to GraphQL.

I created a GraphQL query to validate the user during login. Below is the query,

query{
  userQuery(filter: {
    conjunction: AND, 
    groups: [{conditions: [
      {operator: EQUAL, field: "name", value: "editor.user"},
      {operator: EQUAL, field: "status", value: "1"},
    ]}]}) {
    count
    entities {
        ... on User {
        uid
        name
        pass {
          value
          existing
          preHashed
        }
        mail
      }
    }
  }
}

The query is displaying the pass field as null.

{
  "data": {
    "userQuery": {
      "count": 1,
      "entities": [
        {
          "uid": 15,
          "name": "editor.user",
          "pass": null,
          "mail": "[email protected]"
        }
      ]
    }
  }
}

Am I doing any mistake to query?

Also, is it the right way to validate the user?

Appreciate your suggestion.

berliner avatar
флаг bd
Почему запрос возвращает пароль? Это звучит как плохая идея. Логин должен обрабатываться на стороне сервера. Возможно, это немного поможет: https://gist.github.com/sebas5384/ab0da24e6091f96a6cced2cb6fb0e069 (взято из [этого обсуждения](https://github.com/drupal-graphql/graphql/issues/357) в drupal-graphql очередь выдачи.
флаг us
Да, вам нужно будет использовать мутацию GraphQL для входа в систему, в противном случае возможна публикация в `/user/login?_format=json` Полученный файл cookie сеанса может использоваться для аутентификации последующих запросов. Вы также можете запросить `currentUserContext` после этого с помощью файла cookie авторизации, чтобы получить информацию о пользователе.
флаг cn
@berliner Спасибо за предложение. Приведенный выше запрос был предназначен только для проверки того, работает ли он с предоставленным параметром. Но он возвращает значение 'pass' 'null' . Я также просмотрел предоставленную вами ссылку, она показывает ошибку, когда я ее реализовал.
флаг cn
@DavidThomas: Спасибо за предложение. Согласно документации GraphQL, мутация используется для операции CRUD. Не могли бы вы уточнить подробнее?
флаг cn
Наконец-то я понял, что использование проверки входа в систему может быть реализовано с помощью JWT: https://www.drupal.org/project/jwt, модуля, предоставленного Drupal. Кроме того, необходимо установить еще один модуль «Получить JWT при входе в систему» ​​(https://www.drupal.org/project/getjwtonlogin), который предоставил токен JWT конечному пользователю.
Рейтинг:2
флаг cn

Drupal сохраняет хешированный пароль в базе данных, и это одностороннее шифрование, что означает, что вы не можете получить исходный пароль из него, в процессе аутентификации drupal кодирует входной пароль пользователем и проверяет, равен ли закодированный пароль паролю в базе данных и при встрече это условие, в монолитном проекте (не разделенном) он создает файл cookie с информацией о пользователе и отправляет его обратно в браузер, который будет храниться и использоваться для будущего использования.

Но при разработке развязанного подхода, такого как использование GraphQL, JsonAPI или Rest API, вы не всегда можете использовать cookie, потому что внешнее приложение может не поддерживать его (например, мобильное приложение Android или...), поэтому в этом случае лучше использовать токены для аутентификации, есть несколько модулей, одним из самых популярных является Простой OAuth (OAuth2) и OpenID Connect (СТАБИЛЬНЫЙ И ШИРОКО ИСПОЛЬЗУЕМЫЙ)

после настройки этого модуля (установка с использованием композитора, создание закрытого и открытого ключа и введение потребителей) вы можете просто получить токен, отправив запрос Post:

{SiteName}/oauth/токен

и в теле, которое должно быть типа multipart/form-data (application/json не поддерживается) вы можете:

тип_гранта = пароль
client_id = ИДЕНТИФИКАТОР ПОТРЕБИТЕЛЯ, КОТОРЫЙ ВЫ МОЖЕТЕ СОЗДАТЬ ЧЕРЕЗ ИНТЕРФЕЙС
client_secret = ПОТРЕБИТЕЛЬСКИЙ ПАРОЛЬ (ЕСЛИ ВЫ УСТАНОВИЛИ)
имя пользователя = ИМЯ ПОЛЬЗОВАТЕЛЯ
пароль = ПАРОЛЬ
Scope = РОЛИ, КОТОРЫЕ ВЫ ХОТИТЕ ПОЛЬЗОВАТЕЛЮ ИМЕТЬ, КОТОРЫЕ НЕ ЗАПРЕЩЕНЫ В ПОТРЕБИТЕЛЕ (НЕ ПОВЛИЯЮТ, ЕСЛИ ПОЛЬЗОВАТЕЛЬ НЕ ИМЕЕТ ЭТОЙ РОЛИ, ТАК ЧТО НЕТ ПРОБЛЕМ БЕЗОПАСНОСТИ)

и все, вы получите токен доступа и обновления в ответ. который затем можно использовать в будущих запросах, вызывающих GraphQL или любые другие службы REST.

Одно важное замечание об этом модуле касается использования Scope, а именно: при представлении клиента вы можете назначить этому клиенту одну или несколько областей, и когда пользователь входит в систему через этот клиент, ему будут назначены все роли.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.