ios.php 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. /**
  3. * ios.php
  4. * Created by: Owen
  5. * Created on: 2020/7/8 10:07
  6. *
  7. */
  8. defined('IN_WEB') or die('Include Error!');
  9. require_once __DIR__ . '/../vendor/autoload.php';
  10. use Firebase\JWT\JWT;
  11. /**
  12. * IOS 相关
  13. */
  14. defined('IN_WEB') or die('Include Error!');
  15. class ModelIos{
  16. //获取Apple公钥访问地址:https://appleid.apple.com/auth/keys
  17. private $authKey = '{
  18. "keys": [
  19. {
  20. "kty": "RSA",
  21. "kid": "86D88Kf",
  22. "use": "sig",
  23. "alg": "RS256",
  24. "n": "iGaLqP6y-SJCCBq5Hv6pGDbG_SQ11MNjH7rWHcCFYz4hGwHC4lcSurTlV8u3avoVNM8jXevG1Iu1SY11qInqUvjJur--hghr1b56OPJu6H1iKulSxGjEIyDP6c5BdE1uwprYyr4IO9th8fOwCPygjLFrh44XEGbDIFeImwvBAGOhmMB2AD1n1KviyNsH0bEB7phQtiLk-ILjv1bORSRl8AK677-1T8isGfHKXGZ_ZGtStDe7Lu0Ihp8zoUt59kx2o9uWpROkzF56ypresiIl4WprClRCjz8x6cPZXU2qNWhu71TQvUFwvIvbkE1oYaJMb0jcOTmBRZA2QuYw-zHLwQ",
  25. "e": "AQAB"
  26. },
  27. {
  28. "kty": "RSA",
  29. "kid": "eXaunmL",
  30. "use": "sig",
  31. "alg": "RS256",
  32. "n": "4dGQ7bQK8LgILOdLsYzfZjkEAoQeVC_aqyc8GC6RX7dq_KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdDNq1n52TpxQwI2EqxSk7I9fKPKhRt4F8-2yETlYvye-2s6NeWJim0KBtOVrk0gWvEDgd6WOqJl_yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X-Tip84wqwyRpUlq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll-p_Dg8vAXxJLIJ4SNLcqgFeZe4OfHLgdzMvxXZJnPp_VgmkcpUdRotazKZumj6dBPcXI_XID4Z4Z3OM1KrZPJNdUhxw",
  33. "e": "AQAB"
  34. },
  35. {
  36. "kty": "RSA",
  37. "kid": "YuyXoY",
  38. "use": "sig",
  39. "alg": "RS256",
  40. "n": "1JiU4l3YCeT4o0gVmxGTEK1IXR-Ghdg5Bzka12tzmtdCxU00ChH66aV-4HRBjF1t95IsaeHeDFRgmF0lJbTDTqa6_VZo2hc0zTiUAsGLacN6slePvDcR1IMucQGtPP5tGhIbU-HKabsKOFdD4VQ5PCXifjpN9R-1qOR571BxCAl4u1kUUIePAAJcBcqGRFSI_I1j_jbN3gflK_8ZNmgnPrXA0kZXzj1I7ZHgekGbZoxmDrzYm2zmja1MsE5A_JX7itBYnlR41LOtvLRCNtw7K3EFlbfB6hkPL-Swk5XNGbWZdTROmaTNzJhV-lWT0gGm6V1qWAK2qOZoIDa_3Ud0Gw",
  41. "e": "AQAB"
  42. }
  43. ]
  44. }';
  45. //通过Apple公钥在线(https://8gwifi.org/jwkconvertfunctions.jsp)得到用于解密的pem公钥字符串
  46. //pem公钥 【也可以通过将RSA公钥modulus(N)和exponent(E)转换为PEM文件】
  47. private $publicKey = [
  48. '86D88Kf' => "-----BEGIN PUBLIC KEY-----
  49. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiGaLqP6y+SJCCBq5Hv6p
  50. GDbG/SQ11MNjH7rWHcCFYz4hGwHC4lcSurTlV8u3avoVNM8jXevG1Iu1SY11qInq
  51. UvjJur++hghr1b56OPJu6H1iKulSxGjEIyDP6c5BdE1uwprYyr4IO9th8fOwCPyg
  52. jLFrh44XEGbDIFeImwvBAGOhmMB2AD1n1KviyNsH0bEB7phQtiLk+ILjv1bORSRl
  53. 8AK677+1T8isGfHKXGZ/ZGtStDe7Lu0Ihp8zoUt59kx2o9uWpROkzF56ypresiIl
  54. 4WprClRCjz8x6cPZXU2qNWhu71TQvUFwvIvbkE1oYaJMb0jcOTmBRZA2QuYw+zHL
  55. wQIDAQAB
  56. -----END PUBLIC KEY-----",
  57. 'eXaunmL' => '-----BEGIN PUBLIC KEY-----
  58. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4dGQ7bQK8LgILOdLsYzf
  59. ZjkEAoQeVC/aqyc8GC6RX7dq/KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdD
  60. Nq1n52TpxQwI2EqxSk7I9fKPKhRt4F8+2yETlYvye+2s6NeWJim0KBtOVrk0gWvE
  61. Dgd6WOqJl/yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X+Tip84wqwyRpU
  62. lq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll+p/Dg8vAXxJLIJ4SNLcqgFeZe
  63. 4OfHLgdzMvxXZJnPp/VgmkcpUdRotazKZumj6dBPcXI/XID4Z4Z3OM1KrZPJNdUh
  64. xwIDAQAB
  65. -----END PUBLIC KEY-----',
  66. 'YuyXoY'=>'-----BEGIN PUBLIC KEY-----
  67. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1JiU4l3YCeT4o0gVmxGT
  68. EK1IXR+Ghdg5Bzka12tzmtdCxU00ChH66aV+4HRBjF1t95IsaeHeDFRgmF0lJbTD
  69. Tqa6/VZo2hc0zTiUAsGLacN6slePvDcR1IMucQGtPP5tGhIbU+HKabsKOFdD4VQ5
  70. PCXifjpN9R+1qOR571BxCAl4u1kUUIePAAJcBcqGRFSI/I1j/jbN3gflK/8ZNmgn
  71. PrXA0kZXzj1I7ZHgekGbZoxmDrzYm2zmja1MsE5A/JX7itBYnlR41LOtvLRCNtw7
  72. K3EFlbfB6hkPL+Swk5XNGbWZdTROmaTNzJhV+lWT0gGm6V1qWAK2qOZoIDa/3Ud0
  73. GwIDAQAB
  74. -----END PUBLIC KEY-----
  75. '
  76. ];
  77. public function appleJwtVerify($identityToken){
  78. $token = explode('.',$identityToken);
  79. $kid = json_decode(base64_decode($token[0]),true);
  80. try{
  81. $decoded = JWT::decode($identityToken, $this->publicKey[$kid['kid']], [$kid['alg']]);
  82. return ['status'=>1,'data'=>funs::objectToArray($decoded)];
  83. }catch (Exception $exception){
  84. return ['status'=>0,'error'=>$exception->getMessage()];
  85. }
  86. }
  87. }