CURL 명령을 통해 REST API와 함께 OAuth 인증을 사용하는 방법은 무엇입니까?


18

API에서 더 많은 데이터를 얻기 위해 WordPress Rest Api를 인증과 함께 사용하려고합니다. Oauth 플러그인, rest-api 플러그인 및 WP-CLI에서 API 자격 증명을 얻었습니다.

승인없이 데이터에 액세스하는 방법을 알아 냈습니다. 이것은 작동합니다 :

// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/";


$curl = curl_init($endpoint);

curl_setopt_array($curl, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_URL            => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);

?>

<pre>
  <?php print_r($decoderesponse); ?>
</pre>

그러나 자격 증명으로 인증하는 방법을 알 수 없습니다. 여기 내 시도가 있습니다. "키"와 "비밀"이 올바른지 확실하지 않습니다.

// Oauth credentials from wp-cli
$ID = "4";
$Key = "l8XZD9lX89kb";
$Secret = "UUbcc8vjUkGjuDyvK1gRTts9sZp2N8k9tbIQaGjZ6SNOyR4d";

// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/1/revisions";

$headers[] = "key=$Key";
$headers[] = "secret=$Secret";

$curl = curl_init($endpoint);

curl_setopt_array($curl, [
  CURLOPT_HTTPHEADER     => $headers,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_URL            => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);

?>

<pre>
  <?php print_r($decoderesponse); ?>
</pre>

출력은

Array
(
    [code] => rest_cannot_read
    [message] => Sorry, you cannot view revisions of this post.
    [data] => Array
        (
            [status] => 401
        )
)

이 기능을 작동 시키려면 어떻게해야합니까? 감사합니다.


2
일이 그렇게 쉽지 않습니다. 나는 답을 쓰려고 노력했지만 꽤 길다. 문서, 특히 권한 부여 흐름 을 읽으면서 시작할 수 있습니다. 이 게시물에도 훌륭한 튜토리얼이 있습니다.
cybmeta

답변:


10

여기에서 단계별로 갑시다. 인증 용도로만 OAuth를 사용하려는 것 같지만 그렇게하기 전에 API 호출시 인증하는 데 사용되는 액세스 토큰 을 가져와야합니다.

이것은 OAuth 버전 1을 사용하고 있으므로 액세스 토큰 을 얻으려면 다음을 수행해야합니다.

  1. 먼저 응용 프로그램을 설정하고 사이트를 호출하여 응용 프로그램 의 클라이언트 ID와 비밀을 사용하여 요청 토큰 (임시 자격 증명) 을 얻습니다.
  2. 둘째, 첫 번째 단계에서 요청 토큰으로 애플리케이션을 승인하기 위해 사이트를 호출 하십시오 (사용자 대면, 아래 참조).
  3. 셋째, 인증이 완료된 후 사이트를 호출하여 액세스 토큰 을 얻습니다 (이제 신청이 승인되었습니다).

처음 몇 단계 만 완료하면되므로 Postman을 사용하는 것이 좋습니다. Postman은 timestamp, nonce및을 생성하는 것도 처리 oauth signature하므로 OAuth 라이브러리를 사용하지 않는 경우 Postman을 절대적으로 사용해야합니다. 당신이 당신의 일단 액세스 토큰을 어떤 라이브러리없이 CURL을 통해 통화를 할 수 있습니다.

https://www.getpostman.com/

첫 단계 (설치 신청)

WP OAuth 1 플러그인을 설치하고 활성화 한 다음 사용자> 애플리케이션 아래의 메뉴 항목으로 이동하십시오 . 새 신청서를 추가하고 이름과 설명을 작성하십시오. 콜백을 위해 URL을 통해 사용자를 리디렉션 (권한 부여 후)하거나 oop대역 외 흐름을 통해 리디렉션 대신 검증기 토큰을 표시하는 내부 페이지로 리디렉션합니다.

https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md

두 번째 단계를 진행하려면 생성 된 응용 프로그램에서 클라이언트 ID클라이언트 시크릿 을 사용하여 사이트를 호출하여 임시 자격 증명 (요청 토큰)을 가져와야합니다.

Postman을 열고에 대한 새 호출을 작성하고 http://website.com/oauth1/request, 권한 부여 탭을 클릭하고 드롭 다운에서 OAuth 1.0을 선택하고 클라이언트 키, 클라이언트 비밀번호를 입력하고 서명 방법을 HMAC-SHA1으로 설정하고 매개 변수를 헤더에 추가하고 oauth 서명을 인코딩 한 다음 요청 업데이트 를 클릭하십시오.

우편 배달부 OAuth1 요청

Postman은 자동으로 서명, nonce 및 타임 스탬프를 생성하여 헤더에 추가합니다 (헤더 탭에서 볼 수 있음).

보내기를 클릭하면 포함 된 응답을 받아야 oauth_tokenoauth_token_secret: 우편 배달부 OAuth1 요청 응답

이 값은 다음 단계에서 WordPress 사용자 계정으로 응용 프로그램을 인증하는 데 사용됩니다.

두 번째 단계 (응용 프로그램 승인)

인증 단계는 한 번만 완료하면되며이 단계는 사용자를위한 것이며 모든 사람이 익숙한 단계입니다. 이 단계는 OAuth1을 사용하고 있으며 응용 프로그램이 WordPress 사용자 계정과 연결되어 있어야하기 때문에 필요합니다. 사이트에서 Facebook으로 로그인 할 수있는시기를 생각하면 ... 로그인 한 Facebook으로 안내하고 "권한 부여"를 클릭하십시오. 이것은 워드 프레스 사이트를 통해서만 수행해야합니다.

URL에서 변수를 쉽게 설정할 수 있으므로이 단계에서 웹 브라우저를 사용하는 것이 좋습니다. 그러면 응용 프로그램을 인증 할 수있는 "권한 부여"페이지가 제공됩니다.

웹 브라우저를 열고 다음과 같이 사이트 URL을 입력하십시오. http://website.com/oauth1/authorize

이제이 URL oauth_consumer_key(클라이언트 ID) oauth_tokenoauth_token_secret(이전 단계에서)에 추가하십시오. 내 예에서 이것은 전체 URL입니다.

http://website.com/oauth1/authorize?oauth_consumer_key=TUPFNj1ZTd8u&oauth_token=J98cN81p01aqSdFd9rjkHZWI&oauth_token_secret=RkrMhw8YzXQljyh99BrNHmP7phryUvZgVObpmJtos3QExG1O

OAuth1 승인 신청

승인을 클릭하면 확인 토큰이있는 다른 화면이 나타납니다. 내 예에서 이것은 반환 된 확인 토큰입니다.E0JnxjjYxc32fMr2AF0uWsZm

세 번째 단계 (액세스 토큰 받기)

애플리케이션을 승인 했으므로 모든 API 호출에 사용되는 권한 부여 토큰을 얻기 위해 마지막으로 한 번 호출해야합니다. 첫 번째 단계와 마찬가지로 Postman을 사용하려고합니다 (서명은 HMAC-SHA1이어야하기 때문에).이 단계를 100 배 더 쉽게 완료 할 수 있습니다.

Postman을 다시 열고 URL을 다음으로 변경하십시오. http://website.com/oauth1/access

토큰 및 토큰 시크릿 (첫 번째 단계의 값)을 추가 한 다음 매개 변수 를 클릭 하여 URL 아래에 상자를 표시하십시오. 왼쪽에 oauth_verifier를 입력하고 오른쪽에 두 번째 단계 인 Verification Token 의 코드를 입력하십시오.

우편 배달부 OAuth1 액세스 단계

업데이트 요청을 클릭하는 것을 확인하고 보내기를 클릭하면와 응답 다시 가야 oauth_token하고 oauth_token_secret이것은 당신과 당신의 API 호출을해야 할 것입니다 ...! 1 단계에서 원본을 버리고 코드 또는 다른 곳에 저장하십시오.

우편 배달부 OAuth1 액세스 응답

그런 다음 사이트에 API 호출을 수행하여 반환 된 토큰 및 토큰 비밀을 사용하여 헤더를 설정할 수 있습니다.

권한 부여 헤더를 통해 GET 매개 변수 또는 POST (application / x-www-form-urlencoded로 인코딩 된 경우)를 통해 여러 가지 방법으로 전달할 수 있습니다. 서명, 타임 스탬프 및 nonce를 전달해야합니다. 이 답장이 얼마나 오래 걸릴지 몰랐으므로 내일 코드로 예제를 작성하여 업데이트하겠습니다.

Rest API 로그를 설치하여 API 호출 로그를보고, 전송, 리턴 된 내용 등을 확인할 것을 강력히 권장합니다. 이는 디버깅에 엄청난 도움이됩니다.

https://github.com/petenelson/wp-rest-api-log


Postman 또는 유사한 도구가있는 자습서가 많이 있지만 CURL 기능으로 전체 프로세스를 수행하는 자습서를 찾을 수 없습니다. 순전 한 PHP 코드를 의미합니다. 그것이 내가 원하는 것입니다.
MinhTri

@ Dan9 TBH 실제로는 불가능합니다 ... 적어도 OAuth1에서는 불가능합니다. 주로 사용자 계정으로 응용 프로그램을 승인해야하기 때문입니다. 다른 모든 단계는 CURL을 사용하여 쉽게 수행 할 수 있습니다. 문제는 CURL을 사용하여 WordPress 사용자로 로그인하는 것 (좋은 아이디어가 아닌 PHP 파일에 자격 증명을 저장해야 함을 의미 함)과 응용 프로그램을 인증하는 것입니다. OAuth1 코드베이스를 수정할 수는 있지만 정직하게 CURL을 사용하여 모든 것을 수행하려면 ...이 방법에 대해 잘못 생각하고 있으며 다른 솔루션이나 방법을 생각해 내야합니다.
sMyles

@ Dan9하려는 작업과 함께 OAuth1 대신 OAuth2 서버를 사용해야합니다. 주로 OAuth2에는 클라이언트 자격 증명 부여 유형을 포함한 새로운 기능이 있으므로 bshaffer.github.io
sMyles

@ Dan9 CURL을 사용하여 OAuth1을 통해이 작업을 수행하는 데 도움이되는 경우 100 % 설정하면 몇 가지 코드 해킹으로 가능하다고 생각하지만 언급 한 바와 같이 사용자의 사용자 이름과 비밀번호를 저장해야합니다. PHP 파일에. 그 나왔습니다 잘 당신이 있으면 알려 아픈 CURL을 사용하여 할 수있는 튜토리얼을 작성, 당신은 OAuth2를 함께 갈거야 또는 더 이상이 필요하지 않은 경우 시간 기록 튜토리얼을 보내고 싶지 않아하자
sMyles

@ Dan9 음 ... 그저 ... OAuth1을 사용하려면 WordPress 사용자 계정을 연결해야합니다. 기본적으로 API 토큰과 같은 액세스 토큰을 생각하십시오. "API 키"는 사용자 계정과 연결되어야합니다. 이제 설정 한 일부 표준 계정을 사용할지 여부는 OAuth1과 상관없이 적용됩니다. 액세스 토큰을 얻는 데 시간이 오래 걸리므로 사용자 계정과 연결해야합니다.
sMyles

2

이 작업을 수행하는 방법을 알아내는 데 도움이되도록 다른 답변으로 추가하십시오. 기본적으로 내 의견에서 언급했듯이 OAuth1을 사용하려는 경우 OAuth1을 사용자 계정과 연결해야합니다.

먼저 CURL을 사용하여 WordPress의 사용자 이름 비밀번호로 사이트에 로그인하고 쿠키를 저장하여 OAuth에 대한 CURL 호출에서 사용할 수 있도록하십시오 (쿠키를 포함하도록 CURL 호출을 업데이트하십시오).

/programming/724107/wordpress-autologin-using-curl-or-fsockopen-in-php

그런 다음 클라이언트 ID와 클라이언트 시크릿이있는 CURL을 사용하여 OAuth를 호출하여 임시 oauth 토큰과 시크릿 (요청 토큰)을 얻습니다.

이 통화 (및 액세스 토큰을 얻기위한 통화)를하려면 CURL 통화를 올바르게 설정해야합니다. 코드 및 참조는이 답변의 끝 부분을 참조하십시오.

임시 oauth 토큰과 비밀 (요청 토큰)을 얻은 후 사이트의이 URL에 대해 CURL POST 호출을 작성하십시오.

http://website.com/oauth1/authorize

그런 다음 권한 부여 페이지에 대해 리턴 된 HTML에서 모든 값을 가져 와서 양식 조치 URL에 자체 POST를 제출해야합니다.

/programming/35363815/how-to-get-a-value-input-from-html-returned-of-curl

특히 "권한 부여"POST를 완료하려면 POST 데이터에 이러한 정보를 포함해야합니다. http://domain.com/wp-login.php?action=oauth1_authorize

  • _wpnonce -제출할 양식의 nonce 값입니다. HTML 입력에서 가져 와서 POST와 함께 제출해야합니다.

    consumer -HTML에서 숨겨진 입력입니다 (이것은 게시물 ID에 대한 참조이므로 HTML 입력에서 가져와야합니다)

    oauth_token -이것은 HTML에서 숨겨진 입력입니다 (그러나 이미 가지고 있어야합니다)

    wp-submit -이 값으로 설정해야합니다 authorize

인증 페이지 용으로 생성 된 HTML 예제는 다음과 같습니다.

<form name="oauth1_authorize_form" id="oauth1_authorize_form" action="http://website.com/wp-login.php?action=oauth1_authorize" method="post">

    <h2 class="login-title">Connect My Auth</h2>

    <div class="login-info">
        <p>Howdy <strong>admin</strong>,<br/> "My OAuth Demo" would like to connect to Example Site.</p>

    </div>

    <input type="hidden" name="consumer" value="5428" /><input type="hidden" name="oauth_token" value="i1scugFXyPENniCP4kABKtGb" /><input type="hidden" id="_wpnonce" name="_wpnonce" value="ca9b267b4f" /><input type="hidden" name="_wp_http_referer" value="/wp-login.php?action=oauth1_authorize&amp;oauth_consumer_key=TUPFNj1ZTd8u&amp;oauth_token=i1scugFXyPENniCP4kABKtGb&amp;oauth_token_secret=gzqW47pHG0tilFm9WT7lUgLoqN2YqS6tFFjUEiQoMgcmG2ic" />   <p class="submit">
        <button type="submit" name="wp-submit" value="authorize" class="button button-primary button-large">Authorize</button>
        <button type="submit" name="wp-submit" value="cancel" class="button button-large">Cancel</button>
    </p>

</form>

이러한 모든 값 / 데이터로 POST를 만든 후에는 인증 코드와 함께 반환되는 HTML이므로 <code>블록 내부에서 값을 가져와야합니다 .

<div id="login">
    <h1><a href="https://wordpress.org/" title="Powered by WordPress" tabindex="-1">Example Site</a></h1>
    <p>Your verification token is <code>yGOYFpyawe8iZmmcizqVIw3f</code></p> <p id="backtoblog"><a href="http://website.com/">&larr; Back to Example Site</a></p>
</div>

확인 토큰이 있으면 /oauth1/access확인 토큰, oauth 토큰 및 oauth 토큰 비밀 을 사용하여 전화를 걸 수 있습니다 . 검증 토큰은 POST 데이터에 다음과 같이 넣어야합니다.oauth_verifier

새롭고 영구적 인 액세스 토큰과 VOILA가 반환됩니다!

CURL 코드 예

다음은 CURL 호출을 작성하는 예제 코드이며, 가장 중요한 부분 oauth_signature은 생성 방법 입니다.

https://oauth1.wp-api.org/docs/basics/Signing.html

function buildBaseString($baseURI, $method, $params){
    $r = array();
    ksort($params);
    foreach($params as $key=>$value){
        $r[] = "$key=" . rawurlencode($value);
    }

    return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}

function buildAuthorizationHeader($oauth){
    $r = 'Authorization: OAuth ';
    $values = array();
    foreach($oauth as $key=>$value)
        $values[] = "$key=\"" . rawurlencode($value) . "\"";

    $r .= implode(', ', $values);
    return $r;
}

// Add request, authorize, etc to end of URL based on what call you're making
$url = "http://domain.com/oauth/";

$consumer_key = "CLIENT ID HERE";
$consumer_secret = "CLIENT SECRET HERE";

$oauth = array( 'oauth_consumer_key' => $consumer_key,
                'oauth_nonce' => time(),
                'oauth_signature_method' => 'HMAC-SHA1',
                'oauth_callback' => 'oob',
                'oauth_timestamp' => time(),
                'oauth_version' => '1.0');

$base_info = buildBaseString($url, 'GET', $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;


$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
                  CURLOPT_HEADER => false,
                  CURLOPT_URL => $url,
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_SSL_VERIFYPEER => false);

$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$return_data = json_decode($json);

print_r($return_data);

이 사이트는 OAuth 서명을 인코딩하는 방법과 CURL을 사용하여 보내는 방법을 정확하게 알려줍니다 (전체 페이지를 읽는 것이 좋습니다) : https://hannah.wf/twitter-oauth-simple-curl-requests-for-your-own- 데이터/

OAuth1 서명 생성에 대한 추가 리소스 : /programming/24613277/oauth-signature-generation-using-hmac-sha1

기타 자료 : http://collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/


고객 ID와 고객 비밀을 확보하고 유효한 사용자와 연결하려면 어떻게해야합니까? 현재 관리자 만 새 앱을 만들 수 있으며 관리 대시 보드를 통해서만 발생합니다. Btw, 나는 oauth_signature당신이 말한대로 생성하려고 노력 했지만 어떻게 든 응답은 항상 json_oauth1_signature_mismatch입니다.
MinhTri

@ Dan9 예, 맞습니다. 관리자는 앱을 만들어야합니다. 그렇지 않으면 익명의 사용자가 앱을 만들 수있는 큰 보안 문제가됩니다. 다음은 서명 wordpress.stackexchange.com/questions/185511/… 에 관한 일부 사이트입니다. github.com/WP-API/OAuth1/issues/34 github.com/WP-API/OAuth1/issues/27
sMyles

0

업데이트 : 내가 읽은 것에서 access_token을 얻으려면 여러 번 컬해야하며 쿼리를 수행하는 데 사용됩니다.

  • 임시 자격 증명 획득 : 클라이언트는 서버에서 임시 자격 증명 세트를받습니다.
  • 권한 부여 : 사용자는 계정에 액세스하기 위해 요청 토큰을 "권한 부여"합니다.
  • 토큰 교환 : 클라이언트는 수명이 짧은 임시 자격 증명을 수명이 긴 토큰으로 교환합니다.

oauth1 서버 흐름


0

조금 늦게 들어온다는 것을 알고 있지만 wp_remote_get 및 _post를 사용할 수 있습니까?

WordPress 설치를 사용하여 콘텐츠를 가져와 게시하고 있습니다.

이것은 워드 프레스 코덱스의 일반적인 아이디어입니다.

$response = wp_remote_post( $url, array(
    'body'    => $data,
    'httpversion' => '1.0',
    'sslverify' => false,
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ),
    ),
) );

보다 구체적인 예는 다음과 같습니다.

$url='http://WWW.EXAMPLE HERE.';
$response = wp_remote_post( $url, array(
    'method' => 'POST',
    'timeout' => 45,
    'redirection' => 5,
    'httpversion' => '1.0', //needed to get a response
    'blocking' => true,
    'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MY TOKENID' . ':' . '' )),
    'body' => $body // in array
    'cookies' => array()
    )
);

if ( is_wp_error( $response ) ) {
   $error_message = $response->get_error_message();
   echo "Something went wrong: $error_message";
} else {
 //  echo 'Response:<pre>';
 //  print_r( $response );
 //    echo '</pre>'; 
$responseBody = json_decode($response['body'],true);
echo $responseBody['message'];

    }
    }
}

트릭은 사용자 이름과 비밀번호를 인코딩하는 것입니다. 이제 종종 API 사용자 이름과 pw에 따라 시간이 비어 있거나 토큰이됩니다.

예를 들어 위의 특정 예에서 헤더는

'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MYTOKENID' . ':' . '' ))

그리고 나는 비워 두었다. 그래도 사용중인 API 시스템에 달려 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.