GraphQL API와의 상호작용
GraphQL API와의 상호작용사용자 인증

사용자 인증

실행하는 GraphQL 쿼리는 예를 들어 게시물을 작성하는 뮤테이션을 실행하기 위해 사용자가 로그인되어 있어야 하는 경우가 있습니다.

사용자를 인증하는 방법은 여러 가지가 있습니다.

WordPress의 인증된 세션 쿠키 사용하기

WordPress는 쿠키 기반의 사용자 인증을 사용하기 때문에, WordPress 사이트에 로그인된 상태라면 GraphiQL 클라이언트를 열어 그곳에서 GraphQL 쿼리를 실행하기만 하면 됩니다.

GraphQL 요청에 전송되는 쿠키는 WordPress 사이트의 것과 동일하므로, 사용자는 이미 로그인된 상태가 됩니다.

wp-admin 내의 GraphiQL 클라이언트
wp-admin 내의 GraphiQL 클라이언트

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

WordPress의 Application Passwords를 사용하여 GraphQL 엔드포인트에 인증된 요청을 보낼 수 있습니다.

예를 들어, USERNAMEPASSWORD 값을 교체하여 GraphQL 서버에 대해 curl 명령을 실행할 때 애플리케이션 비밀번호를 전달할 수 있습니다.

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