您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
firebase服务端解密token(id token)及postman一键测试脚本(php实现)
发布时间:2022-10-19 22:57:17编辑:雪饮阅读()
解析令牌
上篇讲到firebase集成了短信及google登录,那么既然登录肯定离不开token令牌,而我们php界用的最广的无非就是jwt,这个jwt还真巧,竟然也是firebase旗下的。
只不过firebase并没有对应我们php端解密其登录令牌的相关介绍,也或许是我没有找到。
但是呢,我还是摸索到了,其实也不难,拿到那个token后要去请求另外一个无参接口,该接口返回证书列表,然后我们的token就是要从这些证书列表中去挨个解析(也或许不是这样,但我目前所理解是这样的),直到解析出token的内容,里面会有包含uid的。
那么如某某类中的一个解析firebase的令牌的方法实现如:
public function third_party_token_check(){
$p_CERTIFICATE_list_str=$this->request->post("p_CERTIFICATE_list_str");
$CERTIFICATE_list=[];
if($p_CERTIFICATE_list_str){
$p_CERTIFICATE_list_str=preg_replace('/[\x00-\x1F]/','', $p_CERTIFICATE_list_str);
$CERTIFICATE_list=json_decode($p_CERTIFICATE_list_str,true);
}
else{
$CERTIFICATE_list_str=file_get_contents("https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com");
$CERTIFICATE_list_str=preg_replace('/[\x00-\x1F]/','', $CERTIFICATE_list_str);
$CERTIFICATE_list=json_decode($CERTIFICATE_list_str,true);
}
$data=$this->request->post();
$jwt=$data["token"];
$decoded=null;
$count=0;
foreach($CERTIFICATE_list as $key=>$val){
try{
$decoded = JWT::decode($jwt,$val,['RS256']);
$decoded=get_object_vars($decoded);
}
catch(\Exception $e){
$count++;
}
}
if($count==count($CERTIFICATE_list)){
return app('json')->fail('third party token fail');
}
$decoded=$this->recursion_object_vars_to_arr($decoded);
Log::write("third_party_token_check:decoded:".var_export($decoded,"true"),"info");
return $this->success("third party token check success");
}
自动化测试脚本编写(解决翻墙问题)
这里为为什么要支持接收post请求的证书列表呢?因为毕竟国外的,大多数情况国内访问不到的,则可以如果用postman的自动化测试就方便了,你的php所运行环境(本人喜欢在vmware虚拟机里搭建linux环境并以samba共享出来)请求不到时候,可以利用postman自动化测试实现先将证书列表取到(假定postman所在环境能翻墙)后再请求上面的这个接口(方法)进行解密。则postman自动化测试编写如:
raw post入参示例:
{
"token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IjVkMzQwZGRiYzNjNWJhY2M0Y2VlMWZiOWQxNmU5ODM3ZWM2MTYzZWIiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vY2NhdC01YmE2YyIsImF1ZCI6ImNjYXQtNWJhNmMiLCJhdXRoX3RpbWUiOjE2NjYxNjQ0NjIsInVzZXJfaWQiOiJWVFdSaWxUYkxvUDY3Nk12b3pJQXJMM2pvNGcxIiwic3ViIjoiVlRXUmlsVGJMb1A2NzZNdm96SUFyTDNqbzRnMSIsImlhdCI6MTY2NjE2NDQ2MiwiZXhwIjoxNjY2MTY4MDYyLCJwaG9uZV9udW1iZXIiOiIrODYxMzkxNjM1NDkxNCIsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsicGhvbmUiOlsiKzg2MTM5MTYzNTQ5MTQiXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwaG9uZSJ9fQ.hAMX1GSTsZ0V1XWOmgYge0N1MSXkI20aPB2J6ihzXhMyQm17a4eT3OtWtaG22ps6q53gkmh8_x89Rc4Xr-8b7H4zvhGiEe8L-HDoFCcYPksnNpWX2siJzmMOJrHpJX84CWhM0rkoiU_ZTNSFwk4q-gO5QSuGvoZ4Q_K-p46XhfTap0NSc_TYq9_25nPi83afB7c7FQk9PbtZXfxnqcHbCJEpCGl_N5-p6b19wIzkXCRYOyq0zbDWJU1t2cpfSaWBRqeVSkZKxB39MkUkvt8r84pjIK5R0lHfObdPYVCY50Ydz4h9x7qHxUvjBkjnUplHAlP4M7lGtojtLT26god2TA",
"p_CERTIFICATE_list_str":""
}
pre-request script:
pm.sendRequest("https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com", function (err, response) {
console.log("获得的证书列表",response.json());
var jpd=JSON.parse(request.data);
console.log("第三方token检查前入参",jpd);
jpd.p_CERTIFICATE_list_str=JSON.stringify(response.json());
console.log("第三方token检查前入参(配合证书)",jpd);
pm.request.body.raw=JSON.stringify(jpd);
});
关键字词:firebase,服务端,解密,token,id,postman,一键,测试,脚本,php,实现