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;
13use OAuth\OAuth1\Token\TokenInterface;
14
15class Yahoo extends AbstractService
16{
17    public function __construct(
18        CredentialsInterface $credentials,
19        ClientInterface $httpClient,
20        TokenStorageInterface $storage,
21        SignatureInterface $signature,
22        UriInterface $baseApiUri = null
23    ) {
24        parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
25
26        if (null === $baseApiUri) {
27            $this->baseApiUri = new Uri('https://social.yahooapis.com/v1/');
28        }
29    }
30
31    /**
32     * {@inheritDoc}
33     */
34    public function getRequestTokenEndpoint()
35    {
36        return new Uri('https://api.login.yahoo.com/oauth/v2/get_request_token');
37    }
38
39    /**
40     * {@inheritdoc}
41     */
42    public function getAuthorizationEndpoint()
43    {
44        return new Uri('https://api.login.yahoo.com/oauth/v2/request_auth');
45    }
46
47    /**
48     * {@inheritdoc}
49     */
50    public function getAccessTokenEndpoint()
51    {
52        return new Uri('https://api.login.yahoo.com/oauth/v2/get_token');
53    }
54
55    /**
56     * {@inheritdoc}
57     */
58    public function refreshAccessToken(TokenInterface $token)
59    {
60        $extraParams = $token->getExtraParams();
61        $bodyParams = array('oauth_session_handle' => $extraParams['oauth_session_handle']);
62
63        $authorizationHeader = array(
64            'Authorization' => $this->buildAuthorizationHeaderForAPIRequest(
65                'POST',
66                $this->getAccessTokenEndpoint(),
67                $this->storage->retrieveAccessToken($this->service()),
68                $bodyParams
69            )
70        );
71
72
73
74        $headers = array_merge($authorizationHeader, $this->getExtraOAuthHeaders(), array());
75
76        $responseBody = $this->httpClient->retrieveResponse($this->getAccessTokenEndpoint(), $bodyParams, $headers);
77
78        $token = $this->parseAccessTokenResponse($responseBody);
79        $this->storage->storeAccessToken($this->service(), $token);
80
81        return $token;
82    }
83
84    /**
85     * {@inheritdoc}
86     */
87    protected function parseRequestTokenResponse($responseBody)
88    {
89        parse_str($responseBody, $data);
90
91        if (null === $data || !is_array($data)) {
92            throw new TokenResponseException('Unable to parse response.');
93        } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
94            throw new TokenResponseException('Error in retrieving token.');
95        }
96
97        return $this->parseAccessTokenResponse($responseBody);
98    }
99
100    /**
101     * {@inheritdoc}
102     */
103    protected function parseAccessTokenResponse($responseBody)
104    {
105        parse_str($responseBody, $data);
106
107        if (null === $data || !is_array($data)) {
108            throw new TokenResponseException('Unable to parse response.');
109        } elseif (isset($data['error'])) {
110            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
111        }
112
113        $token = new StdOAuth1Token();
114
115        $token->setRequestToken($data['oauth_token']);
116        $token->setRequestTokenSecret($data['oauth_token_secret']);
117        $token->setAccessToken($data['oauth_token']);
118        $token->setAccessTokenSecret($data['oauth_token_secret']);
119
120        if (isset($data['oauth_expires_in'])) {
121            $token->setLifetime($data['oauth_expires_in']);
122        } else {
123            $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
124        }
125
126        unset($data['oauth_token'], $data['oauth_token_secret']);
127        $token->setExtraParams($data);
128
129        return $token;
130    }
131}
132