1<?php 2 3namespace OAuth\OAuth2\Service; 4 5use OAuth\OAuth2\Token\StdOAuth2Token; 6use OAuth\Common\Http\Exception\TokenResponseException; 7use OAuth\Common\Http\Uri\Uri; 8use OAuth\Common\Consumer\CredentialsInterface; 9use OAuth\Common\Http\Client\ClientInterface; 10use OAuth\Common\Storage\TokenStorageInterface; 11use OAuth\Common\Http\Uri\UriInterface; 12 13/** 14 * Jawbone UP service. 15 * 16 * @author Andrii Gakhov <andrii.gakhov@gmail.com> 17 * @link https://jawbone.com/up/developer/authentication 18 */ 19class JawboneUP extends AbstractService 20{ 21 /** 22 * Defined scopes 23 * 24 * 25 * @link https://jawbone.com/up/developer/authentication 26 */ 27 // general information scopes 28 const SCOPE_BASIC_READ = 'basic_read'; 29 const SCOPE_EXTENDED_READ = 'extended_read'; 30 const SCOPE_LOCATION_READ = 'location_read'; 31 const SCOPE_FRIENDS_READ = 'friends_read'; 32 // mood scopes 33 const SCOPE_MOOD_READ = 'mood_read'; 34 const SCOPE_MOOD_WRITE = 'mood_write'; 35 // move scopes 36 const SCOPE_MOVE_READ = 'move_read'; 37 const SCOPE_MOVE_WRITE = 'move_write'; 38 // sleep scopes 39 const SCOPE_SLEEP_READ = 'sleep_read'; 40 const SCOPE_SLEEP_WRITE = 'sleep_write'; 41 // meal scopes 42 const SCOPE_MEAL_READ = 'meal_read'; 43 const SCOPE_MEAL_WRITE = 'meal_write'; 44 // weight scopes 45 const SCOPE_WEIGHT_READ = 'weight_read'; 46 const SCOPE_WEIGHT_WRITE = 'weight_write'; 47 // generic event scopes 48 const SCOPE_GENERIC_EVENT_READ = 'generic_event_read'; 49 const SCOPE_GENERIC_EVENT_WRITE = 'generic_event_write'; 50 51 52 public function __construct( 53 CredentialsInterface $credentials, 54 ClientInterface $httpClient, 55 TokenStorageInterface $storage, 56 $scopes = array(), 57 UriInterface $baseApiUri = null 58 ) { 59 parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri); 60 61 if (null === $baseApiUri) { 62 $this->baseApiUri = new Uri('https://jawbone.com/nudge/api/v.1.1/'); 63 } 64 } 65 66 /** 67 * {@inheritdoc} 68 */ 69 public function getAuthorizationUri(array $additionalParameters = array()) 70 { 71 $parameters = array_merge( 72 $additionalParameters, 73 array( 74 'client_id' => $this->credentials->getConsumerId(), 75 'redirect_uri' => $this->credentials->getCallbackUrl(), 76 'response_type' => 'code', 77 ) 78 ); 79 80 $parameters['scope'] = implode(' ', $this->scopes); 81 82 // Build the url 83 $url = clone $this->getAuthorizationEndpoint(); 84 foreach ($parameters as $key => $val) { 85 $url->addToQuery($key, $val); 86 } 87 88 return $url; 89 } 90 91 /** 92 * {@inheritdoc} 93 */ 94 public function getAuthorizationEndpoint() 95 { 96 return new Uri('https://jawbone.com/auth/oauth2/auth'); 97 } 98 99 /** 100 * {@inheritdoc} 101 */ 102 public function getAccessTokenEndpoint() 103 { 104 return new Uri('https://jawbone.com/auth/oauth2/token'); 105 } 106 107 /** 108 * {@inheritdoc} 109 */ 110 protected function getAuthorizationMethod() 111 { 112 return static::AUTHORIZATION_METHOD_HEADER_BEARER; 113 } 114 115 /** 116 * {@inheritdoc} 117 */ 118 protected function parseAccessTokenResponse($responseBody) 119 { 120 $data = json_decode($responseBody, true); 121 122 if (null === $data || !is_array($data)) { 123 throw new TokenResponseException('Unable to parse response.'); 124 } elseif (isset($data['error'])) { 125 throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"'); 126 } 127 128 $token = new StdOAuth2Token(); 129 $token->setAccessToken($data['access_token']); 130 $token->setLifeTime($data['expires_in']); 131 132 if (isset($data['refresh_token'])) { 133 $token->setRefreshToken($data['refresh_token']); 134 unset($data['refresh_token']); 135 } 136 137 unset($data['access_token']); 138 unset($data['expires_in']); 139 140 $token->setExtraParams($data); 141 142 return $token; 143 } 144} 145