0

を使用したGoogleAPIOAuth2へのアクセスのService Account問題google-api-php-client。私が発見したのは、Google Devで設定されたJWTクレームの例のJWT Claim setコードのこの部分が、何らかの理由でtrueを渡すと、ここでエラーが発生JWT HeaderしてUTF-8シリアル化のように感じられるときに間違って返されることです。json_encode()

  $JWT_Header = array(
    "alg" => "RS256",
    "typ" => "JWT"
  );
  $JWT_Body = array(
    "iss" => "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
    "scope" => "https://www.googleapis.com/auth/prediction",
    "aud" => "https://accounts.google.com/o/oauth2/token",
    "exp" => 1328554385,
    "iat" => 1328550785
  );

  $segments = array(
    rtrim(strtr(base64_encode(json_encode($JWT_Header)), '+/', '-_'), '='),
    rtrim(strtr(base64_encode(json_encode($JWT_Body)), '+/', '-_'), '=')
  );
  //echo '<pre>'; print_r($segments); echo '</pre>';

Google Devで説明されているものとは異なります:出力のJWTクレームセットの例のエンコード

/*
    Output: 

    JWT header:
    Google Dev    eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.
     My output    eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.

    JWT Claim set:
    Google Dev    eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.
     My output    eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOlwvXC93d3cuZ29vZ2xlYXBpcy5jb21cL2F1dGhcL3ByZWRpY3Rpb24iLCJhdWQiOiJodHRwczpcL1wvYWNjb3VudHMuZ29vZ2xlLmNvbVwvb1wvb2F1dGgyXC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.
*/

助言がありますか?

4

1 に答える 1

1

UTF-8 とはまったく関係がないようです。デバッグするには、同じアルゴリズムを逆方向に適用するだけです。

$output = array(
    'eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ',
    'eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOlwvXC93d3cuZ29vZ2xlYXBpcy5jb21cL2F1dGhcL3ByZWRpY3Rpb24iLCJhdWQiOiJodHRwczpcL1wvYWNjb3VudHMuZ29vZ2xlLmNvbVwvb1wvb2F1dGgyXC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ',
);

foreach($output as $i){
    print_r(base64_decode(strtr($i, '-_', '+/'))) . PHP_EOL;
    print_r(json_decode(base64_decode(strtr($i, '-_', '+/')))) . PHP_EOL;
}

Google JSON 文字列には、スラッシュをエスケープしないことを除いて、同じ値が含まれていることがわかります。

Google: https://www.googleapis.com/auth/prediction
You:    https:\/\/www.googleapis.com\/auth\/prediction
于 2012-08-05T07:45:35.843 に答える