Yahoo   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 107
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 50
c 1
b 0
f 0
dl 0
loc 107
rs 10
wmc 11

6 Methods

Rating   Name   Duplication   Size   Complexity  
A openid() 0 4 1
A getToken() 0 18 3
A getUserInfo() 0 15 2
A parseToken() 0 7 2
A getRedirectUrl() 0 12 2
A userInfo() 0 15 1
1
<?php
2
/**
3
 * Yahoo OAuth2.0 https://developer.yahoo.com/oauth2/guide/
4
 */
5
namespace tinymeng\OAuth2\Gateways;
6
7
use tinymeng\OAuth2\Connector\Gateway;
8
use tinymeng\OAuth2\Exception\OAuthException;
9
use tinymeng\OAuth2\Helper\ConstCode;
10
11
class Yahoo extends Gateway
12
{
13
    const API_BASE = 'https://api.login.yahoo.com/';
14
    protected $AuthorizeURL = 'https://api.login.yahoo.com/oauth2/request_auth';
15
    protected $AccessTokenURL = 'https://api.login.yahoo.com/oauth2/get_token';
16
    protected $UserInfoURL = 'https://api.login.yahoo.com/openid/v1/userinfo';
17
18
    /**
19
     * 得到跳转地址
20
     */
21
    public function getRedirectUrl()
22
    {
23
        $this->saveState();
24
        $params = [
25
            'client_id'     => $this->config['app_id'],
26
            'redirect_uri'  => $this->config['callback'],
27
            'response_type' => $this->config['response_type'],
28
            'scope'         => $this->config['scope'] ?: 'openid profile',
29
            'state'         => $this->config['state'],
30
            'nonce'         => md5(uniqid()),
31
        ];
32
        return $this->AuthorizeURL . '?' . http_build_query($params);
33
    }
34
35
    /**
36
     * 获取当前授权用户的openid标识
37
     */
38
    public function openid()
39
    {
40
        $result = $this->getUserInfo();
41
        return $result['sub'] ?? '';
42
    }
43
44
    /**
45
     * 获取格式化后的用户信息
46
     */
47
    public function userInfo()
48
    {
49
        $result = $this->getUserInfo();
50
        
51
        $userInfo = [
52
            'open_id'      => $result['sub'] ?? '',
53
            'union_id'     => $result['sub'] ?? '',
54
            'channel'      => ConstCode::TYPE_YAHOO,
55
            'nickname'     => $result['name'] ?? '',
56
            'gender'       => ConstCode::GENDER,
57
            'avatar'       => $result['picture'] ?? '',
58
            'access_token' => $this->token['access_token'] ?? '',
59
            'native'       => $result
60
        ];
61
        return $userInfo;
62
    }
63
64
    /**
65
     * 获取原始接口返回的用户信息
66
     */
67
    public function getUserInfo()
68
    {
69
        $this->getToken();
70
        
71
        $headers = [
72
            'Authorization: Bearer ' . $this->token['access_token'],
73
        ];
74
        
75
        $data = $this->get($this->UserInfoURL, [], $headers);
76
        $data = json_decode($data, true);
77
        
78
        if (!isset($data['sub'])) {
79
            throw new OAuthException('获取Yahoo用户信息失败:' . json_encode($data));
80
        }
81
        return $data;
82
    }
83
84
    /**
85
     * 获取access_token
86
     */
87
    protected function getToken()
88
    {
89
        if (empty($this->token)) {
90
            $this->checkState();
91
            
92
            $params = [
93
                'grant_type'    => $this->config['grant_type'],
94
                'code'          => isset($_REQUEST['code']) ? $_REQUEST['code'] : '',
95
                'redirect_uri'  => $this->config['callback'],
96
            ];
97
            
98
            $headers = [
99
                'Authorization: Basic ' . base64_encode($this->config['app_id'] . ':' . $this->config['app_secret']),
100
                'Content-Type: application/x-www-form-urlencoded',
101
            ];
102
            
103
            $response = $this->post($this->AccessTokenURL, $params, $headers);
104
            $this->token = $this->parseToken($response);
105
        }
106
    }
107
108
    /**
109
     * 解析access_token方法请求后的返回值
110
     */
111
    protected function parseToken($token)
112
    {
113
        $data = json_decode($token, true);
114
        if (isset($data['access_token'])) {
115
            return $data;
116
        }
117
        throw new OAuthException('获取Yahoo access_token 出错:' . json_encode($data));
118
    }
119
}