Аутентификация пользователей
Выполняемый GraphQL-запрос может требовать, чтобы пользователь был авторизован, например, для выполнения мутации создания записи.
Существует несколько способов аутентификации пользователя.
Использование cookies из уже аутентифицированной сессии в WordPress
Поскольку WordPress использует аутентификацию пользователей на основе cookies, когда мы вошли на сайт WordPress, можно просто открыть клиент GraphiQL и выполнять GraphQL queries прямо из него.
Так как cookies, отправляемые вместе с GraphQL-запросом, совпадают с cookies сайта WordPress, пользователь уже будет авторизован.

Мутация 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
}
]
}
})
}