与 GraphQL API 交互
与 GraphQL API 交互用户身份验证

用户身份验证

执行的 GraphQL 查询可能要求用户已登录,例如执行创建文章的 mutation。

有几种方法可以对用户进行身份验证。

由于 WordPress 使用基于 Cookie 的用户身份验证,当我们已登录到 WordPress 站点时,只需打开 GraphiQL 客户端并从中执行 GraphQL 查询即可。

发送到 GraphQL 请求的 Cookie 与 WordPress 站点的 Cookie 相同,因此用户将已处于登录状态。

wp-admin 中的 GraphiQL 客户端
wp-admin 中的 GraphiQL 客户端

loginUser mutation

在执行所需 mutation 的同一 GraphQL 查询中,我们可以使用 loginUser mutation 来对用户进行身份验证。

请注意顺序很重要:loginUser 必须添加在其他 mutation(在本例中为 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

我们可以使用 WordPress Application Passwords 向 GraphQL 端点发送已认证的请求。

例如,在针对 GraphQL 服务器执行 curl 命令时,我们可以传入应用程序密码,替换 USERNAMEPASSWORD 的值:

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

我们可以使用 Gato GraphQL 针对另一个 WordPress 站点执行已认证的 HTTP 请求。

以下查询接收用户名和应用程序密码(以及要连接的端点),创建所需的身份验证标头,并针对外部 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
        }
      ]
    }
  })
}