RsaTokenTest.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <?php
  2. /**
  3. * This file is part of Lcobucci\JWT, a simple library to handle JWT and JWS
  4. *
  5. * @license http://opensource.org/licenses/BSD-3-Clause BSD-3-Clause
  6. */
  7. namespace Lcobucci\JWT\FunctionalTests;
  8. use Lcobucci\JWT\Builder;
  9. use Lcobucci\JWT\Keys;
  10. use Lcobucci\JWT\Parser;
  11. use Lcobucci\JWT\Signer\Key;
  12. use Lcobucci\JWT\Token;
  13. use Lcobucci\JWT\Signature;
  14. use Lcobucci\JWT\Signer\Rsa\Sha256;
  15. use Lcobucci\JWT\Signer\Rsa\Sha512;
  16. /**
  17. * @author Luís Otávio Cobucci Oblonczyk <lcobucci@gmail.com>
  18. * @since 2.1.0
  19. */
  20. class RsaTokenTest extends \PHPUnit\Framework\TestCase
  21. {
  22. use Keys;
  23. /**
  24. * @var Sha256
  25. */
  26. private $signer;
  27. /**
  28. * @before
  29. */
  30. public function createSigner()
  31. {
  32. $this->signer = new Sha256();
  33. }
  34. /**
  35. * @test
  36. *
  37. * @expectedException \InvalidArgumentException
  38. *
  39. * @covers Lcobucci\JWT\Builder
  40. * @covers Lcobucci\JWT\Token
  41. * @covers Lcobucci\JWT\Signature
  42. * @covers Lcobucci\JWT\Claim\Factory
  43. * @covers Lcobucci\JWT\Claim\Basic
  44. * @covers Lcobucci\JWT\Parsing\Encoder
  45. * @covers Lcobucci\JWT\Signer\Key
  46. * @covers Lcobucci\JWT\Signer\BaseSigner
  47. * @covers \Lcobucci\JWT\Signer\OpenSSL
  48. * @covers \Lcobucci\JWT\Signer\Rsa
  49. * @covers \Lcobucci\JWT\Signer\Rsa\Sha256
  50. */
  51. public function builderShouldRaiseExceptionWhenKeyIsInvalid()
  52. {
  53. $user = (object) ['name' => 'testing', 'email' => 'testing@abc.com'];
  54. (new Builder())->setId(1)
  55. ->setAudience('http://client.abc.com')
  56. ->setIssuer('http://api.abc.com')
  57. ->set('user', $user)
  58. ->getToken($this->signer, new Key('testing'));
  59. }
  60. /**
  61. * @test
  62. *
  63. * @expectedException \InvalidArgumentException
  64. *
  65. * @covers Lcobucci\JWT\Builder
  66. * @covers Lcobucci\JWT\Token
  67. * @covers Lcobucci\JWT\Signature
  68. * @covers Lcobucci\JWT\Claim\Factory
  69. * @covers Lcobucci\JWT\Claim\Basic
  70. * @covers Lcobucci\JWT\Parsing\Encoder
  71. * @covers Lcobucci\JWT\Signer\Key
  72. * @covers Lcobucci\JWT\Signer\BaseSigner
  73. * @covers \Lcobucci\JWT\Signer\OpenSSL
  74. * @covers \Lcobucci\JWT\Signer\Rsa
  75. * @covers \Lcobucci\JWT\Signer\Rsa\Sha256
  76. */
  77. public function builderShouldRaiseExceptionWhenKeyIsNotRsaCompatible()
  78. {
  79. $user = (object) ['name' => 'testing', 'email' => 'testing@abc.com'];
  80. (new Builder())->setId(1)
  81. ->setAudience('http://client.abc.com')
  82. ->setIssuer('http://api.abc.com')
  83. ->set('user', $user)
  84. ->getToken($this->signer, static::$ecdsaKeys['private']);
  85. }
  86. /**
  87. * @test
  88. *
  89. * @covers Lcobucci\JWT\Builder
  90. * @covers Lcobucci\JWT\Token
  91. * @covers Lcobucci\JWT\Signature
  92. * @covers Lcobucci\JWT\Claim\Factory
  93. * @covers Lcobucci\JWT\Claim\Basic
  94. * @covers Lcobucci\JWT\Parsing\Encoder
  95. * @covers Lcobucci\JWT\Signer\Key
  96. * @covers Lcobucci\JWT\Signer\BaseSigner
  97. * @covers \Lcobucci\JWT\Signer\OpenSSL
  98. * @covers \Lcobucci\JWT\Signer\Rsa
  99. * @covers \Lcobucci\JWT\Signer\Rsa\Sha256
  100. */
  101. public function builderCanGenerateAToken()
  102. {
  103. $user = (object) ['name' => 'testing', 'email' => 'testing@abc.com'];
  104. $token = (new Builder())->setId(1)
  105. ->setAudience('http://client.abc.com')
  106. ->setIssuer('http://api.abc.com')
  107. ->set('user', $user)
  108. ->setHeader('jki', '1234')
  109. ->sign($this->signer, static::$rsaKeys['private'])
  110. ->getToken();
  111. $this->assertAttributeInstanceOf(Signature::class, 'signature', $token);
  112. $this->assertEquals('1234', $token->getHeader('jki'));
  113. $this->assertEquals('http://client.abc.com', $token->getClaim('aud'));
  114. $this->assertEquals('http://api.abc.com', $token->getClaim('iss'));
  115. $this->assertEquals($user, $token->getClaim('user'));
  116. return $token;
  117. }
  118. /**
  119. * @test
  120. *
  121. * @depends builderCanGenerateAToken
  122. *
  123. * @covers Lcobucci\JWT\Builder
  124. * @covers Lcobucci\JWT\Parser
  125. * @covers Lcobucci\JWT\Token
  126. * @covers Lcobucci\JWT\Signature
  127. * @covers Lcobucci\JWT\Claim\Factory
  128. * @covers Lcobucci\JWT\Claim\Basic
  129. * @covers Lcobucci\JWT\Parsing\Encoder
  130. * @covers Lcobucci\JWT\Parsing\Decoder
  131. */
  132. public function parserCanReadAToken(Token $generated)
  133. {
  134. $read = (new Parser())->parse((string) $generated);
  135. $this->assertEquals($generated, $read);
  136. $this->assertEquals('testing', $read->getClaim('user')->name);
  137. }
  138. /**
  139. * @test
  140. *
  141. * @depends builderCanGenerateAToken
  142. *
  143. * @covers Lcobucci\JWT\Builder
  144. * @covers Lcobucci\JWT\Parser
  145. * @covers Lcobucci\JWT\Token
  146. * @covers Lcobucci\JWT\Signature
  147. * @covers Lcobucci\JWT\Parsing\Encoder
  148. * @covers Lcobucci\JWT\Claim\Factory
  149. * @covers Lcobucci\JWT\Claim\Basic
  150. * @covers Lcobucci\JWT\Signer\Key
  151. * @covers Lcobucci\JWT\Signer\BaseSigner
  152. * @covers \Lcobucci\JWT\Signer\OpenSSL
  153. * @covers \Lcobucci\JWT\Signer\Rsa
  154. * @covers \Lcobucci\JWT\Signer\Rsa\Sha256
  155. */
  156. public function verifyShouldReturnFalseWhenKeyIsNotRight(Token $token)
  157. {
  158. $this->assertFalse($token->verify($this->signer, self::$rsaKeys['encrypted-public']));
  159. }
  160. /**
  161. * @test
  162. *
  163. * @depends builderCanGenerateAToken
  164. *
  165. * @covers Lcobucci\JWT\Builder
  166. * @covers Lcobucci\JWT\Parser
  167. * @covers Lcobucci\JWT\Token
  168. * @covers Lcobucci\JWT\Signature
  169. * @covers Lcobucci\JWT\Parsing\Encoder
  170. * @covers Lcobucci\JWT\Claim\Factory
  171. * @covers Lcobucci\JWT\Claim\Basic
  172. * @covers Lcobucci\JWT\Signer\Key
  173. * @covers Lcobucci\JWT\Signer\BaseSigner
  174. * @covers \Lcobucci\JWT\Signer\OpenSSL
  175. * @covers \Lcobucci\JWT\Signer\Rsa
  176. * @covers \Lcobucci\JWT\Signer\Rsa\Sha256
  177. * @covers \Lcobucci\JWT\Signer\Rsa\Sha512
  178. */
  179. public function verifyShouldReturnFalseWhenAlgorithmIsDifferent(Token $token)
  180. {
  181. $this->assertFalse($token->verify(new Sha512(), self::$rsaKeys['public']));
  182. }
  183. /**
  184. * @test
  185. *
  186. * @expectedException \InvalidArgumentException
  187. *
  188. * @depends builderCanGenerateAToken
  189. *
  190. * @covers Lcobucci\JWT\Builder
  191. * @covers Lcobucci\JWT\Parser
  192. * @covers Lcobucci\JWT\Token
  193. * @covers Lcobucci\JWT\Signature
  194. * @covers Lcobucci\JWT\Parsing\Encoder
  195. * @covers Lcobucci\JWT\Claim\Factory
  196. * @covers Lcobucci\JWT\Claim\Basic
  197. * @covers Lcobucci\JWT\Signer\Key
  198. * @covers Lcobucci\JWT\Signer\BaseSigner
  199. * @covers \Lcobucci\JWT\Signer\OpenSSL
  200. * @covers \Lcobucci\JWT\Signer\Rsa
  201. * @covers \Lcobucci\JWT\Signer\Rsa\Sha256
  202. */
  203. public function verifyShouldRaiseExceptionWhenKeyIsNotRsaCompatible(Token $token)
  204. {
  205. $this->assertFalse($token->verify($this->signer, self::$ecdsaKeys['public1']));
  206. }
  207. /**
  208. * @test
  209. *
  210. * @depends builderCanGenerateAToken
  211. *
  212. * @covers Lcobucci\JWT\Builder
  213. * @covers Lcobucci\JWT\Parser
  214. * @covers Lcobucci\JWT\Token
  215. * @covers Lcobucci\JWT\Signature
  216. * @covers Lcobucci\JWT\Parsing\Encoder
  217. * @covers Lcobucci\JWT\Claim\Factory
  218. * @covers Lcobucci\JWT\Claim\Basic
  219. * @covers Lcobucci\JWT\Signer\Key
  220. * @covers Lcobucci\JWT\Signer\BaseSigner
  221. * @covers \Lcobucci\JWT\Signer\OpenSSL
  222. * @covers \Lcobucci\JWT\Signer\Rsa
  223. * @covers \Lcobucci\JWT\Signer\Rsa\Sha256
  224. */
  225. public function verifyShouldReturnTrueWhenKeyIsRight(Token $token)
  226. {
  227. $this->assertTrue($token->verify($this->signer, self::$rsaKeys['public']));
  228. }
  229. /**
  230. * @test
  231. *
  232. * @covers Lcobucci\JWT\Builder
  233. * @covers Lcobucci\JWT\Parser
  234. * @covers Lcobucci\JWT\Token
  235. * @covers Lcobucci\JWT\Signature
  236. * @covers Lcobucci\JWT\Signer\Key
  237. * @covers Lcobucci\JWT\Signer\BaseSigner
  238. * @covers \Lcobucci\JWT\Signer\OpenSSL
  239. * @covers \Lcobucci\JWT\Signer\Rsa
  240. * @covers \Lcobucci\JWT\Signer\Rsa\Sha256
  241. * @covers Lcobucci\JWT\Claim\Factory
  242. * @covers Lcobucci\JWT\Claim\Basic
  243. * @covers Lcobucci\JWT\Parsing\Encoder
  244. * @covers Lcobucci\JWT\Parsing\Decoder
  245. */
  246. public function everythingShouldWorkWhenUsingATokenGeneratedByOtherLibs()
  247. {
  248. $data = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJoZWxsbyI6IndvcmxkIn0.s'
  249. . 'GYbB1KrmnESNfJ4D9hOe1Zad_BMyxdb8G4p4LNP7StYlOyBWck6q7XPpPj_6gB'
  250. . 'Bo1ohD3MA2o0HY42lNIrAStaVhfsFKGdIou8TarwMGZBPcif_3ThUV1pGS3fZc'
  251. . 'lFwF2SP7rqCngQis_xcUVCyqa8E1Wa_v28grnl1QZrnmQFO8B5JGGLqcrfUHJO'
  252. . 'nJCupP-Lqh4TmIhftIimSCgLNmJg80wyrpUEfZYReE7hPuEmY0ClTqAGIMQoNS'
  253. . '98ljwDxwhfbSuL2tAdbV4DekbTpWzspe3dOJ7RSzmPKVZ6NoezaIazKqyqkmHZfcMaHI1lQeGia6LTbHU1bp0gINi74Vw';
  254. $token = (new Parser())->parse((string) $data);
  255. $this->assertEquals('world', $token->getClaim('hello'));
  256. $this->assertTrue($token->verify($this->signer, self::$rsaKeys['public']));
  257. }
  258. }