summaryrefslogtreecommitdiff
path: root/app/Auth/Google.php
blob: 587ecde1fcd367345dd947f0ea452643d2d3f090 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<?php

namespace Auth;

use Core\Request;
use OAuth\Common\Storage\Session;
use OAuth\Common\Consumer\Credentials;
use OAuth\Common\Http\Uri\UriFactory;
use OAuth\ServiceFactory;
use OAuth\Common\Http\Exception\TokenResponseException;

/**
 * Google backend
 *
 * @package  auth
 * @author   Frederic Guillot
 */
class Google extends Base
{
    /**
     * Backend name
     *
     * @var string
     */
    const AUTH_NAME = 'Google';

    /**
     * Authenticate a Google user
     *
     * @access public
     * @param  string  $google_id   Google unique id
     * @return boolean
     */
    public function authenticate($google_id)
    {
        $user = $this->user->getByGoogleId($google_id);

        if ($user) {

            // Create the user session
            $this->user->updateSession($user);

            // Update login history
            $this->lastLogin->create(
                self::AUTH_NAME,
                $user['id'],
                Request::getIpAddress(),
                Request::getUserAgent()
            );

            return true;
        }

        return false;
    }

    /**
     * Unlink a Google account for a given user
     *
     * @access public
     * @param  integer   $user_id    User id
     * @return boolean
     */
    public function unlink($user_id)
    {
        return $this->user->update(array(
            'id' => $user_id,
            'google_id' => '',
        ));
    }

    /**
     * Update the user table based on the Google profile information
     *
     * @access public
     * @param  integer   $user_id    User id
     * @param  array     $profile    Google profile
     * @return boolean
     */
    public function updateUser($user_id, array $profile)
    {
        return $this->user->update(array(
            'id' => $user_id,
            'google_id' => $profile['id'],
            'email' => $profile['email'],
            'name' => $profile['name'],
        ));
    }

    /**
     * Get the Google service instance
     *
     * @access public
     * @return \OAuth\OAuth2\Service\Google
     */
    public function getService()
    {
        $uriFactory = new UriFactory();
        $currentUri = $uriFactory->createFromSuperGlobalArray($_SERVER);
        $currentUri->setQuery('controller=user&action=google');

        $storage = new Session(false);

        $credentials = new Credentials(
            GOOGLE_CLIENT_ID,
            GOOGLE_CLIENT_SECRET,
            $currentUri->getAbsoluteUri()
        );

        $serviceFactory = new ServiceFactory();

        return $serviceFactory->createService(
            'google',
            $credentials,
            $storage,
            array('userinfo_email', 'userinfo_profile')
        );
    }

    /**
     * Get the authorization URL
     *
     * @access public
     * @return \OAuth\Common\Http\Uri\Uri
     */
    public function getAuthorizationUrl()
    {
        return $this->getService()->getAuthorizationUri();
    }

    /**
     * Get Google profile information from the API
     *
     * @access public
     * @param  string    $code   Google authorization code
     * @return bool|array
     */
    public function getGoogleProfile($code)
    {
        try {

            $googleService = $this->getService();
            $googleService->requestAccessToken($code);
            return json_decode($googleService->request('https://www.googleapis.com/oauth2/v1/userinfo'), true);
        }
        catch (TokenResponseException $e) {
            return false;
        }
    }
}