Взаимодействие с GraphQL API
Взаимодействие с GraphQL APIАутентификация пользователей

Аутентификация пользователей

Выполняемый GraphQL-запрос может требовать, чтобы пользователь был авторизован, например, для выполнения мутации создания записи.

Существует несколько способов аутентификации пользователя.

Использование cookies из уже аутентифицированной сессии в WordPress

Поскольку WordPress использует аутентификацию пользователей на основе cookies, когда мы вошли на сайт WordPress, можно просто открыть клиент GraphiQL и выполнять GraphQL queries прямо из него.

Так как cookies, отправляемые вместе с GraphQL-запросом, совпадают с cookies сайта WordPress, пользователь уже будет авторизован.

Клиент GraphiQL внутри wp-admin
Клиент GraphiQL внутри wp-admin

Мутация loginUser

В том же GraphQL-запросе для выполнения нужной мутации можно использовать мутацию loginUser для аутентификации пользователя.

Обратите внимание, что порядок важен: loginUser должна быть добавлена перед другой мутацией (в данном случае — createPost):

mutation {
  loginUser(
    by: {
      credentials: {
        usernameOrEmail: "myusername",
        password: "mypassword"
      }
    }
  ) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
      ...on GenericErrorPayload {
        code
      }
    }
    userID
  }
 
  createPost(input: {
    title: "Hello world!"
    contentAs: {
      html: "<p>How are you?</p>"
    }
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      id
      title
      content
    }
  }
}

Application Passwords

Можно использовать Application Passwords WordPress для отправки аутентифицированного запроса к GraphQL-эндпоинту.

Например, можно передать пароль приложения при выполнении команды curl к GraphQL-серверу, заменив значения USERNAME и PASSWORD:

curl -i \
  --user "USERNAME:PASSWORD" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"query": "{ me { name } }"}' \
  https://mysite.com/graphql

С помощью Gato GraphQL можно выполнять аутентифицированные HTTP-запросы к другому сайту WordPress.

Приведённый ниже запрос принимает имя пользователя и пароль приложения (а также эндпоинт для подключения), формирует необходимый заголовок аутентификации и выполняет запрос к внешнему GraphQL-серверу:

query GetDataFromExternalWPSite(
  $username: String!
  $appPassword: String!
  $endpoint: URL!
) {
  loginCredentials: _sprintf(
    string: "%s:%s",
    values: [$username, $appPassword]
  )
    @remove
 
  base64EncodedLoginCredentials: _strBase64Encode(
    string: $__loginCredentials
  )
    @remove
 
  loginCredentialsHeaderValue: _sprintf(
    string: "Basic %s",
    values: [$__base64EncodedLoginCredentials]
  )
    @remove
 
  externalHTTPRequestWithUserPassword: _sendGraphQLHTTPRequest(input:{
    endpoint: $endpoint,
    query: """
  
{
  me {
    name
  }
}
 
    """,
    options: {
      headers: [
        {
          name: "Authorization",
          value: $__loginCredentialsHeaderValue
        }
      ]
    }
  })
}