2016-12-19 10 views
3

コード:openssl_verify()がJWTトークンの署名を検証できないのはなぜですか?

$token = $request->getQueryParams(); 
$jwt_access_token = $token['access_token']; 

$separator = '.'; 

list($header, $payload, $signature) = explode($separator, $jwt_access_token); 

$decoded_signature = base64_decode($signature); 

$payload_to_verify = utf8_decode($header . $separator . $payload); 

$public_key = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/pubkey.pem'); 

$verified = openssl_verify($payload_to_verify, $decoded_signature, $public_key, OPENSSL_ALGO_SHA256); 

例のアクセストークン:

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpZCI6IjU0YmEzYmQwZDRkYzAxYmZhNmJjYjdjYTIwOTQwY2YzY2NmM2EyNjQiLCJqdGkiOiI1NGJhM2JkMGQ0ZGMwMWJmYTZiY2I3Y2EyMDk0MGNmM2NjZjNhMjY0IiwiaXNzIjoiIiwiYXVkIjoidGVzdGNsaWVudCIsInN1YiI6InNhbGxlIiwiZXhwIjoxNDgyMTIyODY4LCJpYXQiOjE0ODIxMTkyNjgsInRva2VuX3R5cGUiOiJiZWFyZXIiLCJzY29wZSI6bnVsbH0.q-xwz16YbUiaDzdeiNBoaeZIYNx8G6HXLZRMJjpiezotq0nICTokVxuf3OUur6433MhT6wVCUENUeuJfuvLg3wKZWHfXSoTMG77Gkv1Wart6hlIPFqyZ13gyTzquaKRRDoRD9WSBcKXfTF6V59cWHrwAM5nRIQeOzBdYXZPwnV-9RhXUpjUhJ0LKRJsDZ5EwJUFsIDb7oZ70b3uLJqa79h42Dc5mQWj75uIo8mVCmH9N1BPJRn-Hb9ttgpu2oRgDOqsm4zdBz2CfSkPiHa-j6qKEWHocyLQBZ8XLxyvFSAFVIwqv4OVCBHanzbkfY-ZKkKh1THeyiIcrB9ed6vwzRg 

公開鍵:

-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs3k2ZkpYqCX94B+qC2yc 
4atWx+C5d7kFQAgBrbv5gfFuIST0DLt5lvv0OZZI57+ydNXb2G/jyOJPH3ll2mHS 
Z+PKAo9aQoL5iYIjz+yYp2Im51LBh4e0Kt1RSjuy4M5RI1JVSsM9rt3NoLMzehv8 
57g+uv1T177cJabDvKeqWdD0qR4N7PE/nV0Hrumz5kP4EnYhN0A2wjbXyyyllxhL 
nr3Wqii0XJxBF3AwLUlqP1NYhm2wYq0CTjQrgv3/9WCvr4fSzBitzQAP6ZIFRHO3 
F8EIaK6r6cDiP2ABmtTrmPAj3ZpqGVBPnvY9yVrqUS0pMxjvvesJiPd2jGrjLQFN 
LQIDAQAB 
-----END PUBLIC KEY----- 

私は1を返すようにopenssl_verify()機能を得ることができませんそれはいつも戻るs 0(トークンを検証できません)。なぜか分からない。誰でも正しい方向に向けることができますか?

+0

問題の詳細を追加してください。 http://stackoverflow.com/help/how-to-ask –

+0

openssl_verify()関数は1を返すことができません。常に0を返します(トークンを検証できません)。なぜか分からない。 – Dadi

+0

"シグネチャが正しい場合は1を返し、正しくない場合は0を返し、エラーの場合は-1を返します。あなたの署名は間違っています。 – miken32

答えて

2

JWSの部分はBase64でエンコードされていませんが、Base64 Url Safeがエンコードされているため失敗します。

エラーがラインから来る

$ decoded_signature = BASE64_DECODE($署名)。これは

$ decoded_signature = BASE64_DECODE(strtr($署名、 '-_'、 '+ /'))であるべきである

+0

これは動作します、ありがとうございます! – Dadi

関連する問題