summaryrefslogtreecommitdiff
path: root/app/Model/Google.php
blob: f5beb8f85ea320ed2893509c6206d237a1f1c756 (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
151
152
<?php

namespace Model;

require __DIR__.'/../../vendor/OAuth/bootstrap.php';

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 model
 *
 * @package  model
 * @author   Frederic Guillot
 */
class Google extends Base
{
    /**
     * Authenticate a Google user
     *
     * @access public
     * @param  string  $google_id   Google unique id
     * @return boolean
     */
    public function authenticate($google_id)
    {
        $userModel = new User($this->db, $this->event);
        $user = $userModel->getByGoogleId($google_id);

        if ($user) {

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

            // Update login history
            $lastLogin = new LastLogin($this->db, $this->event);
            $lastLogin->create(
                LastLogin::AUTH_GOOGLE,
                $user['id'],
                $userModel->getIpAddress(),
                $userModel->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)
    {
        $userModel = new User($this->db, $this->event);

        return $userModel->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)
    {
        $userModel = new User($this->db, $this->event);

        return $userModel->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;
        }

        return false;
    }
}