CURL komutları aracılığıyla REST API ile OAuth kimlik doğrulaması nasıl kullanılır?


18

API'den daha fazla veri almak için kimlik doğrulaması ile WordPress Rest Api kullanmaya çalışıyorum. Oauth eklentisini, rest-api eklentisini yükledim ve WP-CLI'den API kimlik bilgilerini aldım.

Yetkisiz verilere nasıl erişebileceğimi anladım. Bu çalışıyor:

// 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>

Ancak kimlik bilgileriyle nasıl kimlik doğrulaması yapacağımı anlayamıyorum. İşte benim girişimim. "Anahtar" ve "gizli" nin doğru olup olmadığından emin değilim.

// 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>

Çıktı

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

Bunu nasıl çalıştırabilirim? Teşekkür ederim.


2
İşler o kadar kolay değil. Bir cevap yazmaya çalışıyorum ama oldukça uzun. Özellikle Yetkilendirme Akışı dokümanlarını okuyarak başlayabilirsiniz . Bu yazıların harika bir öğreticisi de var .
cybmeta

Yanıtlar:


10

Burada adım adım gidelim. Görünüşe göre OAuth'u yalnızca kimlik doğrulama için kullanmaya çalışıyorsunuz, ancak bunu yapmadan önce API çağrılarınızı yaparken kimlik doğrulamak için kullanılacak Erişim Jetonunu almanız gerekiyor .

Bu, OAuth sürüm 1 kullandığından, Erişim Simgesini edinmek için aşağıdakileri yapmanız gerekir:

  1. İlk olarak, bir uygulama kurun , istemcinin kimliğini ve uygulamanın sırrını kullanarak İstek Jetonu (geçici kimlik bilgileri) almak için siteyi arayın
  2. İkinci olarak, ilk adımdan (Kullanıcıya dönük, aşağıya bakın) Talep Jetonu ile Uygulamaya yetki vermek için siteyi arayın .
  3. Üçüncüsü, yetkilendirme tamamlandıktan sonra, Erişim Simgesini almak için siteye bir çağrı yaparsınız (şimdi uygulama yetkilendirildi)

İlk birkaç adım için Postman'ı kullanmanızı öneririm, çünkü bunların sadece bir kez tamamlanması gerekir. Postacı ayrıca timestamp, nonceve oauth signatureOAuth kitaplığı kullanmıyorsanız, Postacı'yı mutlaka kullanmalısınız. Access Token'ınızı aldıktan sonra herhangi bir kütüphane olmadan CURL üzerinden çağrı yapabilirsiniz.

https://www.getpostman.com/

İlk Adım (kurulum uygulaması)

WP OAuth 1 eklentisini yükleyin, etkinleştirin, ardından Kullanıcılar> Uygulamalar altındaki menü öğesine gidin . Yeni uygulama ekleyin, isim ve açıklama girin. Geri arama için, kullanıcıyı (yetkilendirdikten sonra) yönlendirecek URL veya oopdoğrulayıcı jetonunu görüntüleyen dahili bir sayfaya yönlendirecek olan Bant Dışı akışı için (yönlendirme yerine).

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

İkinci adıma geçmek için, oluşturulmuş uygulamadaki Client ID ve Client Secret kullanılarak geçici kimlik bilgileri almak için sitenize bir çağrı yapılması gerekir (İstek Jetonu).

Postacı'yı açın, yeni bir çağrı oluşturun http://website.com/oauth1/request, Yetkilendirme sekmesini tıklayın, açılır menüden OAuth 1.0'ı seçin, İstemci Anahtarını, İstemci Sırrını girin, imza yöntemini ayarlayın HMAC-SHA1, başlığa paramitler eklemeyi etkinleştirin, oauth imzasını kodlayın , ardından Güncelleme İsteğini tıklayın.

Postacı OAuth1 İsteği

Postacı sizin için otomatik olarak imza, nonce ve zaman damgası oluşturur ve bunları başlığa ekler (Başlıklar sekmesi altında görüntüleyebilirsiniz).

Gönder tıklayın ve içeren bir cevap alırsınız oauth_tokenve oauth_token_secret: Postman OAuth1 Yanıt İste

Bu değerler, bir sonraki adımda WordPress kullanıcı hesabınız altında uygulamayı yetkilendirmek için kullanılacaktır.

İkinci Adım (başvuruyu yetkilendir)

Yetkilendirme adımının yalnızca bir kez tamamlanması gerekir, bu adım kullanıcı yüzündedir ve herkesin bildiği adımdır. Bu adım, OAuth1 kullandığınız ve uygulamanın bir WordPress kullanıcı hesabıyla ilişkilendirilmesi gerektiği için gereklidir. Bir sitenin Facebook ile giriş yapmanıza ne zaman izin verdiğini düşünün ... sizi giriş yaptığınız Facebook'a yönlendirin ve "Yetkilendir" i tıklayın ... bunun sadece WordPress siteniz üzerinden yapılması gerekiyor.

URL'deki değişkenleri kolayca ayarlayabileceğiniz için Web Tarayıcınızı bu adım için kullanmanızı öneririm ve bu, uygulamayı yetkilendirmek için "Yetkilendir" sayfasını sağlar.

Web tarayıcınızı açın ve sitenizin URL'sini aşağıdaki gibi yazın: http://website.com/oauth1/authorize

Şimdi bu URL'ye oauth_consumer_key(Müşteri Kimliği) oauth_tokenve oauth_token_secret(önceki adımdan) ekleyin . Örneğimde bu tam URL:

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

OAuth1 Yetkilendirme Başvurusu

Yetkilendir'i tıkladığınızda, doğrulama belirtecini içeren başka bir ekran alırsınız. Örneğimde bu, döndürülen doğrulama jetonuE0JnxjjYxc32fMr2AF0uWsZm

Üçüncü Adım (erişim belirteci edinin)

Uygulamayı yetkilendirdiğimize göre, tüm API çağrılarınızı yapmak için kullanılacak Yetkilendirme Jetonunu almak için son bir çağrı yapmamız gerekiyor. Tıpkı ilk adımda olduğu gibi Postman'ı kullanacağım (çünkü imza HMAC-SHA1 olması gerekiyor) ve bu adımları tamamlamayı 100 kat kolaylaştırıyor.

Postacı'yı tekrar açın ve URL'yi http://website.com/oauth1/access

Token ve Token Secret'ı (ilk adımdaki değerler) eklediğinizden emin olun, ardından URL'nin altındaki kutuları göstermek için Params'ı tıklayın . Soldaki oauth_verifier yazın ve sağdaki ikinci adım olan Doğrulama Jetonu'ndaki kodu girin

Postacı OAuth1 Erişim Adımı

Güncelleme İsteği'ni ve ardından Gönder'i tıkladığınızdan emin olun ve geri yanıt almalısınız oauth_tokenve oauth_token_secret... API çağrılarınızı yapmak için ihtiyacınız olan şey budur! Orijinalleri 1. adımdan atın, bunları kodunuza veya güvenli bir yere kaydedin.

Postacı OAuth1 Erişim Yanıtı

Daha sonra sitenize bir API çağrısı yaparak başlıkları döndürülen belirteç ve belirteç sırrı ile ayarlayabilirsiniz.

Yetkilendirme üstbilgisi aracılığıyla GET parametrelerinde veya POST (application / x-www-form-urlencoded olarak kodlanmışsa) bunu birden çok yoldan geçirebilirsiniz. İmzayı, zaman damgasını ve nonce'yi geçmeniz GEREKİR. Bu cevabın beni ne kadar sürdüğünü fark etmedim, bu yüzden bunu yarın kodunuzla yapmaya örnek olarak güncelleyeceğim.

API çağrılarının günlüğünü görüntüleyebilmeniz ve nelerin gönderildiğini, geri döndüğünü vb. Görebilmeniz için Rest API günlüğünü yüklemenizi şiddetle tavsiye ederim. Bu, hata ayıklamada çok yardımcı olacaktır.

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


Biliyorum, Postacı veya benzeri araçlarla birçok öğretici var ama CURL işlevleri ile tüm işlemi yapmak için herhangi bir öğretici bulamıyorum, saf PHP kodu demek. İstediğim bu.
MinhTri

@ Dan9 TBH gerçekten mümkün değil ... en azından OAuth1 ile değil, esas olarak uygulamayı bir kullanıcı hesabı altında YETKİLENDİRMEKTEDİR. Diğer tüm adımları CURL ile yapmak kolaydır, sorun bir WordPress kullanıcısı olarak oturum açmak için CURL kullanmaktır (yani, PHP dosyanızda kimlik bilgilerini saklamanız gerekir) Bu iyi bir fikir DEĞİLDİR ve uygulamayı yetkilendirmek için OAuth1 kod tabanını değiştirebilir, ancak dürüst olmak gerekirse, HER ŞEYİ yapmak için CURL kullanmak istiyorsanız ... bunu yanlış bir şekilde düşünüyorsunuz ve başka bir çözüm veya yöntem bulmalısınız.
sMyles

@ Dan9, yapmaya çalıştığınız şeyle birlikte, temel olarak OAuth2'nin İstemci Kimlik Bilgileri hibe türü de dahil olmak üzere yeni özelliklere sahip olması, bshaffer.github.io / oauth2-server-php-docs / grant-types /…
sMyles

@ Dan9, CURL kullanarak OAuth1 aracılığıyla yardım alma konusunda% 100 ayarlanmışsanız, birkaç kod hackiyle mümkün olduğunu düşünüyorum, ancak bahsettiğim gibi, bir kullanıcının USERNAME ve PASSWORD'ini kaydetmeniz gerekiyor PHP dosyasına. Eğer bu konuda iyiyseniz, bana bildirin ve CURL kullanarak yapmak için bir öğretici yazarım, OAuth2 ile gidecekseniz ya da artık buna ihtiyacınız yoksa zaman yazma öğreticisini harcamak istemeyin
sMyles

@ Dan9 iyi ... hepsi bu ... OAuth1 kullanacaksanız, bir WordPress Kullanıcı Hesabı ilişkilendirmeniz gerekir. Temel olarak Erişim Jetonunu bir API anahtarı gibi düşünün ... "API Anahtarı" nın bir kullanıcı hesabıyla ilişkilendirilmesi gerekir ... Şimdi ayarladığınız bazı standart hesapları kullanıp kullanmadığınız size kalmış .. ama OAuth1 kullanırken ne olursa olsun Bir kullanıcı hesabıyla ilişkili OLMALIDIR, dolayısıyla erişim belirtecini almak için uzun bir süreç.
sMyles

2

Bunu nasıl yapacağınızı anlamanıza yardımcı olması için bunu başka bir cevap olarak eklemek. Temel olarak yorumlarımda belirtildiği gibi OAuth1 kullanacaksanız, bunu bir kullanıcı hesabıyla ilişkilendirmeniz GEREKİR, bunun hiçbir yolu yoktur.

İlk olarak, WordPress için bir kullanıcı adı şifresi ile siteye giriş yapmak için CURL kullanmanız gerekir, Çerez'i OAuth'a CURL çağrınızda kullanabilmeniz için saklayın (CURL çağrınızı çerezi içerecek şekilde güncellediğinizden emin olun):

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

Ardından, geçici oauth jetonunu ve sırrını almak için Müşteri Kimliği ve İstemci Sırrı ile CURL kullanarak OAuth'u arayın (İstek Simgesi)

Bu çağrıyı (ve erişim belirteci edinme çağrısını) yapmak için CURL çağrınızı doğru şekilde ayarlamanız gerekir. Kod ve referanslar için bu cevabın sonuna bakınız.

Geçici oauth jetonunu ve sırrını (İstek Jetonu) aldıktan sonra, sitenizin bu URL'sine bir CURL POST çağrısı yapın:

http://website.com/oauth1/authorize

Daha sonra, yetkilendirme sayfası için döndürülen HTML'deki tüm değerleri almanız ve ardından form eylem URL'sine kendi POST'nuzu göndermeniz gerekir.

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

Özellikle, "yetkilendirme" POST'unu tamamlamak için bunların POST verilerinize eklenmesi gerekir http://domain.com/wp-login.php?action=oauth1_authorize

  • _wpnonce - Bu, gönderilecek formun nonce değeridir, bu HTML girişinden alınmalı ve POST'nuzla gönderilmelidir ZORUNLU

    consumer - Bu, HTML'deki gizli bir giriştir (bu bir Post ID'ye referanstır, bu yüzden HTML girişinden almanız gerekir

    oauth_token - Bu, HTML'deki gizli bir giriştir (ancak buna zaten sahip olmalısınız)

    wp-submit - Bunun değere ayarlanması gerekiyor authorize

Kimlik doğrulama sayfası için oluşturulan örnek 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'u tüm bu değerlerle / verilerle yaptıktan sonra, yetkilendirme koduyla döndürülecek HTML'dir (bu nedenle değeri <code>bloğun içinden çekmeniz gerekir :

<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>

Doğrulama jetonunu aldıktan sonra /oauth1/access, doğrulama jetonunu, oauth jetonunu ve oauth jetonu sırrını kullanarak arama yapabilirsiniz . Doğrulama belirtecinin POST verilerine şu şekilde yerleştirilmesi gerekir:oauth_verifier

Bu, yeni ve kalıcı Erişim Simgenizi ve VOILA'yı döndürür!

Örnek CURL Kodu

Aşağıda CURL çağrısı yapmak için örnek kod verilmiştir, en önemli kısmı nasıl oauth_signatureüretildiğidir:

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);

Bu site tam olarak OAuth imzasının nasıl kodlanacağını ve CURL kullanarak nasıl gönderileceğini anlatır (tüm sayfayı okumanızı öneririm): https://hannah.wf/twitter-oauth-simple-curl-requests-for-your-own- veri/

OAuth1 imzası oluşturma hakkında daha fazla kaynak: /programming/24613277/oauth-signature-generation-using-hmac-sha1

Diğer Kaynaklar: http://collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/


İstemci Kimliğini ve İstemciyi nasıl gizli tutabilirim ve geçerli bir kullanıcıyla nasıl ilişkilendirebilirim? Şu anda, yalnızca yöneticiler yeni bir uygulama oluşturabilir ve bu uygulama yalnızca yönetici kontrol panelinden gerçekleşir. Btw, söylediğin gibi üretmeye çalıştım oauth_signatureama her nasılsa cevap her zaman json_oauth1_signature_mismatch.
MinhTri

@ Dan9 evet bu doğru, yöneticiler uygulamayı oluşturmak zorunda, aksi takdirde bu uygulamalar anonim kullanıcılar tarafından oluşturulmasına izin büyük bir güvenlik sorunu olacaktır. İşte wordpress.stackexchange.com/questions/185511/… github.com/WP-API/OAuth1/issues/34 github.com/WP-API/OAuth1/issues/27
sMyles

0

Güncelleme: Okuduğumdan, daha sonra sorguyu yapmak için kullandığınız access_token'ı almak için birden fazla bukle yapmanız gerekiyor

  • Geçici Kimlik Bilgileri Alma: İstemci sunucudan bir dizi geçici kimlik bilgisi alır.
  • Yetkilendirme: Kullanıcı, istek belirtecini hesaplarına erişmesi için "yetkilendirir".
  • Belirteç Değişimi: Müşteri, kısa ömürlü geçici kimlik bilgilerini uzun ömürlü bir belirteçle değiştirir.

oauth1 sunucu akışı


0

Biraz geç geldiğimi biliyorum, ama wp_remote_get ve _post kullanabilir misiniz?

Onları kullanarak wordpress kurulumumla içerik çekiyorum ve gönderiyorum:

Bu wordpress kodeksinden genel fikir:

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

İşte daha spesifik bir örnek:

$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'];

    }
    }
}

Hile, kullanıcı adını ve pw'yi kodlıyor. Şimdi sık sık API kullanıcı adına ve pw'ye bağlı zaman boş olacak veya belirteçleriniz olacaktır.

örneğin, yukarıdaki özel örneğimde, başlıklar

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

ve pw'yi boş bıraktım. Bu, kullandığınız API sistemine bağlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.