This is an answer for anyone who seeks a simple verification middleware for jwks, might not be ideal for production!!! You are more than welcome to suggest a better solution :)
I switched to firebase/php-jwt as it is more convenient and straightforward to use and it was fairly easier to go quickly through its code and it does not return undefined anymore. Now the middleware code for validation looks like below:
$jwks?=?['keys'?=>?[[], []];?
//?JWK::parseKeySet($jwks)?returns?an?associative?array?of?**kid**?to?private
//?key.?Pass?this?as?the?second?parameter?to?JWT::decode.
// Instead of RS256 use your own algo
// $data can return error so wrap it in try catch and do as you desire afterward
$data=?(array)?JWT::decode("YOUR_ACCESS_TOKEN",?JWK::parseKeySet($jwks),?['RS256',?'RS256']);
For those who are willing to test a sample encoding and decoding process, feel free to use the private key and public key below: (Credit to firebase documentation with a bit of tweaking on my side to convert it to a simple Laravel controller)
<?php
namespace?AppHttpControllers;
use?IlluminateHttpRequest;
use?FirebaseJWTJWT;
use?FirebaseJWTJWK;
use?IlluminateSupportFacadesHttp;
class?JWTValidation?extends?Controller
{
????public?function?bundle(){
????????
????????$privateKey?=?<<<EOD
????????-----BEGIN?RSA?PRIVATE?KEY-----
????????MIICXAIBAAKBgQC8kGa1pSjbSYZVebtTRBLxBz5H4i2p/llLCrEeQhta5kaQu/Rn
????????vuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t0tyazyZ8JXw+KgXTxldMPEL9
????????5+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4ehde/zUxo6UvS7UrBQIDAQAB
????????AoGAb/MXV46XxCFRxNuB8LyAtmLDgi/xRnTAlMHjSACddwkyKem8//8eZtw9fzxz
????????bWZ/1/doQOuHBGYZU8aDzzj59FZ78dyzNFoF91hbvZKkg+6wGyd/LrGVEB+Xre0J
????????Nil0GReM2AHDNZUYRv+HYJPIOrB0CRczLQsgFJ8K6aAD6F0CQQDzbpjYdx10qgK1
????????cP59UHiHjPZYC0loEsk7s+hUmT3QHerAQJMZWC11Qrn2N+ybwwNblDKv+s5qgMQ5
????????5tNoQ9IfAkEAxkyffU6ythpg/H0Ixe1I2rd0GbF05biIzO/i77Det3n4YsJVlDck
????????ZkcvY3SK2iRIL4c9yY6hlIhs+K9wXTtGWwJBAO9Dskl48mO7woPR9uD22jDpNSwe
????????k90OMepTjzSvlhjbfuPN1IdhqvSJTDychRwn1kIJ7LQZgQ8fVz9OCFZ/6qMCQGOb
????????qaGwHmUK6xzpUbbacnYrIM6nLSkXgOAwv7XXCojvY614ILTK3iXiLBOxPu5Eu13k
????????eUz9sHyD6vkgZzjtxXECQAkp4Xerf5TGfQXGXhxIX52yH+N2LtujCdkQZjXAsGdm
????????B2zNzvrlgRmgBrklMTrMYgm1NPcW+bRLGcwgW2PTvNM=
????????-----END?RSA?PRIVATE?KEY-----
????????EOD;
????????$publicKey?=?<<<EOD
????????-----BEGIN?PUBLIC?KEY-----
????????MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8kGa1pSjbSYZVebtTRBLxBz5H
????????4i2p/llLCrEeQhta5kaQu/RnvuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t
????????0tyazyZ8JXw+KgXTxldMPEL95+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4
????????ehde/zUxo6UvS7UrBQIDAQAB
????????-----END?PUBLIC?KEY-----
????????EOD;
????????
????????$payload?=?array(
????????????"iss"?=>?"example.org",
????????????"aud"?=>?"example.com",
????????????"iat"?=>?1356999524,
????????????"nbf"?=>?1357000000
????????);
????????
????????$jwt?=?JWT::encode($payload,?$privateKey,?'RS256');
????????//echo?"Encode:
"?.?print_r($jwt,?true)?.?"
";
????????
????????$decoded?=?JWT::decode($jwt,?$publicKey,?array('RS256'));
????????
????????/*
?????????NOTE:?This?will?now?be?an?object?instead?of?an?associative?array.?To?get
?????????an?associative?array,?you?will?need?to?cast?it?as?such:
????????*/
????????
????????$decoded_array?=?(array)?$decoded;
????????return?response()->json(['jwt'?=>?$jwt,?'decoded'?=>?$decoded]);
????????//echo?"Decode:
"?.?print_r($decoded_array,?true)?.?"
";
????}
}
Now back to my first question again :)
In case that I validate the key with the help of this library as the first piece of the code, am I exposing any vulnerability? or will it be a time-consuming task in long run to maintain a custom verification flow like this?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…