2016-03-26 39 views
0

私はshopify apiトークンを生成するためにshopify documentationに従っています。ここでShopifyアプリがshopify APIトークンを生成しています。「このリクエストはShopifyのものではありません!

は私が

http://localhost/shopify/shopify-generating-api-token-guide/generate_token.php?code=86f5027cxxxxxxxxx9c5d&hmac=fcf1e1bexxxxxxxxa97b0f79ec1ec7b473e0bc36bf71&shop=ecommerce-52.myshopify.com&signature=12a6ab63c04d9844ff6xxxxxx0&timestamp=1458991225 

にリダイレクトしています。しかし、それは言うのインストール]をクリックした後、それは、インストールアプリページに私をリダイレクトし

install.phpを
<?php 

// Set variables for our request 
$shop = "ecommerce-52"; 
$api_key = "6bdad749dxxxx24c462c7d2af"; 
$scopes = "read_orders,write_products"; 
$redirect_uri = "http://localhost/shopify/shopify-generating-api-token-guide/generate_token.php"; 
//$redirect_uri = "https://ecommerce-52.myshopify.com"; 

// Build install/approval URL to redirect to 
$install_url = "https://" . $shop . ".myshopify.com/admin/oauth/authorize?client_id=" . $api_key . "&scope=" . $scopes . "&redirect_uri=" . urlencode($redirect_uri); 

//print_r($install_url); 
// Redirect 
header("Location: " . $install_url); 
die(); 

ための私のコードです:

This request is NOT from Shopify! 

ここはgenerate_token.phpのコードです

<?php 

// Get our helper functions 
require_once("inc/functions.php"); 

// Set variables for our request 
$shop = "ecommerce-52"; 
$api_key = "6bdad749xxxxxxx24c462c7d2af"; 
$shared_secret = "c679xxxxx3ac11474599"; 
$code = $_GET["code"]; 
$timestamp = $_GET["timestamp"]; 
$signature = $_GET["signature"]; 

// Compile signature data 
$signature_data = $shared_secret . "code=" . $code . "shop=". $shop . ".myshopify.comtimestamp=" . $timestamp; 

// Use signature data to check that the response is from Shopify or not 
if (md5($signature_data) === $signature) { 

    // Set variables for our request 
    $query = array(
     "Content-type" => "application/json", // Tell Shopify that we're expecting a response in JSON format 
     "client_id" => $api_key, // Your API key 
     "client_secret" => $shared_secret, // Your app credentials (secret key) 
     "code" => $code // Grab the access key from the URL 
    ); 

    // Call our Shopify function 
    $shopify_response = shopify_call(NULL, $shop, "/admin/oauth/access_token", $query, 'POST'); 

    // Convert response into a nice and simple array 
    $shopify_response = json_decode($shopify_response['response'], TRUE); 

    // Store the response 
    $token = $shopify_response['access_token']; 

    // Show token (DO NOT DO THIS IN YOUR PRODUCTION ENVIRONMENT) 
    echo $token; 

} else { 
    // Someone is trying to be shady! 
    die('This request is NOT from Shopify!'); 
} 

私はそれは私が間違ってやっているということですいただきまし把握することはできません。どんな助けもありがとう。

アップデート:私もHerokuの上でそれを展開しようとしました

(これはデフォルトでHTTPSです)、まだ運。 $signature$md5($signature_data)の値が同じでない理由を理解できません。

+0

あなたはgenerate_token.phpからMD5の値($ signature_data)と$署名 –

+0

を提供することはできますか? –

+0

はい、あるものがnullのような単純なものか、あるいは異なるフォーマットのものがあるかどうか疑問に思っていました。ここで –

答えて

0

共有キーを含むハッシュを構築しています。これは、$ code、$ shop、$ timestampの値が改ざんされておらず、共有キーを持っている人からの要求であることを保証します。

だから私は、これにつながる次のシナリオを考えることができます。

  1. の$ shared_secret、$コード、$ショップ、$タイムスタンプ 改ざんされている(そう)
  2. 計算する方法ハッシュが間違っています - $ signature_data = $ shared_secret "code =" $コード。 "店="。 $店 。 ".myshopify.comtimestamp ="。 $ timestamp; (それはたとえば コードだそうな場合)
  3. クライアント上のMD5が壊れている(そう)
  4. ところで、私はあなたがどこかにbase64でエンコードする必要はありません驚いています。
  5. あなたの$ shared_secretが異なる である(そうで 場合は、サンプルコードを変更していない)あなたはすでに公にすることができ、サーバーに展開されている場合
+0

私は店舗、api_keyと共有秘密を除いてサンプルコードで何も変更していません..残りのために私はルーチンに従っています。 最初にinstall.phpを参照して>>承認ページを取得し、次にgenerate_tokenページにリダイレクトします。ここではエラーが発生します –

+0

そのメソッドはサンプルコードのものとまったく同じです。 –

0

は私が知っている私の(それは私が最初にチェックするものです) Shopifyによってアクセスされますか?

あなたはローカルでやっていて、ローカルでoauthを検証しようとしているようですが、私は正しいと思いますが、リダイレクトの場合は必ず失敗します。

+0

私はherokuサーバーにもデプロイしようとしましたが、まだ運がありません。なぜ私は両方の値($ signatureとmd5($ signature_data))が同じでないのか理解できません。 –

0

Shopifyでは、アプリケーションサーバーをSSLで保護する必要があります。 Oauthはこのために失敗します。私はしばらくこの頭に頭を叩いた。古い文書やチュートリアルでは、localhostを使ってテストすることができますが、これはもう間違っています。

+0

解決策は何ですか?今どこでテストしますか? –

+0

私のherokuアプリはすでにhttpsです。 たとえばhttps://myapp.herokuapp.com –

0

うわー、私はShopifyがそれにリンクしているのには驚いています。そのコード例はすべて間違っています。

「要求はShopifyからではありません」エラーを返す関数は、hmacコードを誤って計算しています。私はこれを他のいくつかの図書館、特にShopify以外の人が管理している図書館で見ました。 HMAC署名ため

部分はなければならない:応答データからhmacsignatureフィールドを除去により得られた

  1. 。 (これは、これとほとんどのサードパーティ製のライブラリが間違っているところです。ドキュメントが表示されているフィールドを残りの部分として作成することがよくありますが、誤っているのはドキュメントのすべてのフィールドが表示されないためです。
  2. キー名でアルファベット順にソートされています(PHPではksort()関数を使用できます)。
  3. 特殊文字がクエリ文字列のコード値に置き換えられました(つまり、%%25になります)。
  4. クエリ文字列に変換されます。 (PHP:)
  5. ハッシュhmac標準 sha256と共有秘密を使用しています。 (hash_hmac('sha256', $toTest, $secret);

はここにあなたのための作業例です:

public function verifyRequest($request, $secret) { 
    // Per the Shopify docs: 
    // Everything except hmac and signature... 

    // Plain PHP, pass in $request as assoc array of all query string items 
    $hmac = $request['hmac']; 
    unset($request['hmac']); 
    unset($request['signature']); 
    $signature = $request; 

    // Laravel or other framework with a first-class Request object 
    // Use this or the unsets, above, not both 
    $signature = $request->except(['hmac', 'signature']); 



    // Sorted lexilogically... 
    ksort($signature); 

    // Special characters replaced... 
    foreach ($signature as $k => $val) { 
     $k = str_replace('%', '%25', $k); 
     $k = str_replace('&', '%26', $k); 
     $k = str_replace('=', '%3D', $k); 
     $val = str_replace('%', '%25', $val); 
     $val = str_replace('&', '%26', $val); 
     $signature[$k] = $val; 
    } 

    // Hashed per hmac standards, using sha256 and the shared secret 
    $test = hash_hmac('sha256', http_build_query($signature), $secret); 

    // Verified when equal 
    return $request->input('hmac') === $test; // Laravel/frameworked code 
    return $hmac === $test; // Vanilla PHP/using the array unset block 
} 
関連する問題