Session.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace OAuth\Common\Storage;
  3. use OAuth\Common\Token\TokenInterface;
  4. use OAuth\Common\Storage\Exception\TokenNotFoundException;
  5. use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
  6. /**
  7. * Stores a token in a PHP session.
  8. */
  9. class Session implements TokenStorageInterface
  10. {
  11. /**
  12. * @var bool
  13. */
  14. protected $startSession;
  15. /**
  16. * @var string
  17. */
  18. protected $sessionVariableName;
  19. /**
  20. * @var string
  21. */
  22. protected $stateVariableName;
  23. /**
  24. * @param bool $startSession Whether or not to start the session upon construction.
  25. * @param string $sessionVariableName the variable name to use within the _SESSION superglobal
  26. * @param string $stateVariableName
  27. */
  28. public function __construct(
  29. $startSession = true,
  30. $sessionVariableName = 'lusitanian-oauth-token',
  31. $stateVariableName = 'lusitanian-oauth-state'
  32. ) {
  33. if ($startSession && !isset($_SESSION)) {
  34. session_start();
  35. }
  36. $this->startSession = $startSession;
  37. $this->sessionVariableName = $sessionVariableName;
  38. $this->stateVariableName = $stateVariableName;
  39. if (!isset($_SESSION[$sessionVariableName])) {
  40. $_SESSION[$sessionVariableName] = array();
  41. }
  42. if (!isset($_SESSION[$stateVariableName])) {
  43. $_SESSION[$stateVariableName] = array();
  44. }
  45. }
  46. /**
  47. * {@inheritDoc}
  48. */
  49. public function retrieveAccessToken($service)
  50. {
  51. if ($this->hasAccessToken($service)) {
  52. return unserialize($_SESSION[$this->sessionVariableName][$service]);
  53. }
  54. throw new TokenNotFoundException('Token not found in session, are you sure you stored it?');
  55. }
  56. /**
  57. * {@inheritDoc}
  58. */
  59. public function storeAccessToken($service, TokenInterface $token)
  60. {
  61. $serializedToken = serialize($token);
  62. if (isset($_SESSION[$this->sessionVariableName])
  63. && is_array($_SESSION[$this->sessionVariableName])
  64. ) {
  65. $_SESSION[$this->sessionVariableName][$service] = $serializedToken;
  66. } else {
  67. $_SESSION[$this->sessionVariableName] = array(
  68. $service => $serializedToken,
  69. );
  70. }
  71. // allow chaining
  72. return $this;
  73. }
  74. /**
  75. * {@inheritDoc}
  76. */
  77. public function hasAccessToken($service)
  78. {
  79. return isset($_SESSION[$this->sessionVariableName], $_SESSION[$this->sessionVariableName][$service]);
  80. }
  81. /**
  82. * {@inheritDoc}
  83. */
  84. public function clearToken($service)
  85. {
  86. if (array_key_exists($service, $_SESSION[$this->sessionVariableName])) {
  87. unset($_SESSION[$this->sessionVariableName][$service]);
  88. }
  89. // allow chaining
  90. return $this;
  91. }
  92. /**
  93. * {@inheritDoc}
  94. */
  95. public function clearAllTokens()
  96. {
  97. unset($_SESSION[$this->sessionVariableName]);
  98. // allow chaining
  99. return $this;
  100. }
  101. /**
  102. * {@inheritDoc}
  103. */
  104. public function storeAuthorizationState($service, $state)
  105. {
  106. if (isset($_SESSION[$this->stateVariableName])
  107. && is_array($_SESSION[$this->stateVariableName])
  108. ) {
  109. $_SESSION[$this->stateVariableName][$service] = $state;
  110. } else {
  111. $_SESSION[$this->stateVariableName] = array(
  112. $service => $state,
  113. );
  114. }
  115. // allow chaining
  116. return $this;
  117. }
  118. /**
  119. * {@inheritDoc}
  120. */
  121. public function hasAuthorizationState($service)
  122. {
  123. return isset($_SESSION[$this->stateVariableName], $_SESSION[$this->stateVariableName][$service]);
  124. }
  125. /**
  126. * {@inheritDoc}
  127. */
  128. public function retrieveAuthorizationState($service)
  129. {
  130. if ($this->hasAuthorizationState($service)) {
  131. return $_SESSION[$this->stateVariableName][$service];
  132. }
  133. throw new AuthorizationStateNotFoundException('State not found in session, are you sure you stored it?');
  134. }
  135. /**
  136. * {@inheritDoc}
  137. */
  138. public function clearAuthorizationState($service)
  139. {
  140. if (array_key_exists($service, $_SESSION[$this->stateVariableName])) {
  141. unset($_SESSION[$this->stateVariableName][$service]);
  142. }
  143. // allow chaining
  144. return $this;
  145. }
  146. /**
  147. * {@inheritDoc}
  148. */
  149. public function clearAllAuthorizationStates()
  150. {
  151. unset($_SESSION[$this->stateVariableName]);
  152. // allow chaining
  153. return $this;
  154. }
  155. public function __destruct()
  156. {
  157. if ($this->startSession) {
  158. session_write_close();
  159. }
  160. }
  161. }