1<?php
2
3namespace OAuth\OAuth1\Service;
4
5use OAuth\OAuth1\Signature\SignatureInterface;
6use OAuth\OAuth1\Token\StdOAuth1Token;
7use OAuth\Common\Http\Exception\TokenResponseException;
8use OAuth\Common\Http\Uri\Uri;
9use OAuth\Common\Consumer\CredentialsInterface;
10use OAuth\Common\Http\Uri\UriInterface;
11use OAuth\Common\Storage\TokenStorageInterface;
12use OAuth\Common\Http\Client\ClientInterface;
13
14class FitBit extends AbstractService
15{
16    public function __construct(
17        CredentialsInterface $credentials,
18        ClientInterface $httpClient,
19        TokenStorageInterface $storage,
20        SignatureInterface $signature,
21        UriInterface $baseApiUri = null
22    ) {
23        parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
24
25        if (null === $baseApiUri) {
26            $this->baseApiUri = new Uri('https://api.fitbit.com/1/');
27        }
28    }
29
30    /**
31     * {@inheritdoc}
32     */
33    public function getRequestTokenEndpoint()
34    {
35        return new Uri('https://api.fitbit.com/oauth/request_token');
36    }
37
38    /**
39     * {@inheritdoc}
40     */
41    public function getAuthorizationEndpoint()
42    {
43        return new Uri('https://www.fitbit.com/oauth/authorize');
44    }
45
46    /**
47     * {@inheritdoc}
48     */
49    public function getAccessTokenEndpoint()
50    {
51        return new Uri('https://api.fitbit.com/oauth/access_token');
52    }
53
54    /**
55     * {@inheritdoc}
56     */
57    protected function parseRequestTokenResponse($responseBody)
58    {
59        parse_str($responseBody, $data);
60
61        if (null === $data || !is_array($data)) {
62            throw new TokenResponseException('Unable to parse response.');
63        } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
64            throw new TokenResponseException('Error in retrieving token.');
65        }
66
67        return $this->parseAccessTokenResponse($responseBody);
68    }
69
70    /**
71     * {@inheritdoc}
72     */
73    protected function parseAccessTokenResponse($responseBody)
74    {
75        parse_str($responseBody, $data);
76
77        if (null === $data || !is_array($data)) {
78            throw new TokenResponseException('Unable to parse response.');
79        } elseif (isset($data['error'])) {
80            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
81        }
82
83        $token = new StdOAuth1Token();
84
85        $token->setRequestToken($data['oauth_token']);
86        $token->setRequestTokenSecret($data['oauth_token_secret']);
87        $token->setAccessToken($data['oauth_token']);
88        $token->setAccessTokenSecret($data['oauth_token_secret']);
89
90        $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
91        unset($data['oauth_token'], $data['oauth_token_secret']);
92        $token->setExtraParams($data);
93
94        return $token;
95    }
96}
97