Interagindo com a API GraphQL
Interagindo com a API GraphQLAutenticação de usuário

Autenticação de usuário

A query GraphQL a ser executada pode exigir que o usuário esteja logado, por exemplo, para executar uma mutation que cria um post.

Existem várias maneiras de autenticar o usuário.

Usando cookies de uma sessão já autenticada no WordPress

Como o WordPress utiliza autenticação de usuário baseada em cookies, sempre que estamos logados no site WordPress, podemos simplesmente abrir o cliente GraphiQL e executar queries GraphQL a partir daí.

Como os cookies enviados para a requisição GraphQL são os mesmos do site WordPress, o usuário já estará logado.

Cliente GraphiQL dentro do wp-admin
Cliente GraphiQL dentro do wp-admin

Mutation loginUser

Na mesma query GraphQL para executar a mutation necessária, podemos usar a mutation loginUser para autenticar o usuário.

Note que a ordem importa: loginUser deve ser adicionado antes da outra mutation (neste caso, 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

Podemos usar as Application Passwords do WordPress para enviar uma requisição autenticada ao endpoint GraphQL.

Por exemplo, podemos passar a senha da aplicação ao executar o comando curl contra o servidor GraphQL, substituindo os valores USERNAME e PASSWORD:

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

Podemos usar o Gato GraphQL para executar requisições HTTP autenticadas contra outro site WordPress.

A query abaixo recebe o nome de usuário e a senha da aplicação (além do endpoint ao qual se conectar), cria o cabeçalho de autenticação necessário e executa uma query contra o servidor GraphQL externo:

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
        }
      ]
    }
  })
}