123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <?php
- /**
- * Google strategy for Opauth
- * based on https://developers.google.com/accounts/docs/OAuth2
- *
- * More information on Opauth: http://opauth.org
- *
- * @copyright Copyright © 2012 U-Zyn Chua (http://uzyn.com)
- * @link http://opauth.org
- * @package Opauth.GoogleStrategy
- * @license MIT License
- */
- /**
- * Google strategy for Opauth
- * based on https://developers.google.com/accounts/docs/OAuth2
- *
- * @package Opauth.Google
- */
- class GoogleStrategy extends OpauthStrategy{
-
- /**
- * Compulsory config keys, listed as unassociative arrays
- */
- public $expects = array('client_id', 'client_secret');
-
- /**
- * Optional config keys, without predefining any default values.
- */
- public $optionals = array('redirect_uri', 'scope', 'state', 'access_type', 'approval_prompt');
-
- /**
- * Optional config keys with respective default values, listed as associative arrays
- * eg. array('scope' => 'email');
- */
- public $defaults = array(
- 'redirect_uri' => '{complete_url_to_strategy}oauth2callback',
- 'scope' => 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email'
- );
-
- /**
- * Auth request
- */
- public function request(){
- $url = 'https://accounts.google.com/o/oauth2/auth';
- $params = array(
- 'client_id' => $this->strategy['client_id'],
- 'redirect_uri' => $this->strategy['redirect_uri'],
- 'response_type' => 'code',
- 'scope' => $this->strategy['scope']
- );
- foreach ($this->optionals as $key){
- if (!empty($this->strategy[$key])) $params[$key] = $this->strategy[$key];
- }
-
- $this->clientGet($url, $params);
- }
-
- /**
- * Internal callback, after OAuth
- */
- public function oauth2callback(){
- if (array_key_exists('code', $_GET) && !empty($_GET['code'])){
- $code = $_GET['code'];
- $url = 'https://accounts.google.com/o/oauth2/token';
- $params = array(
- 'code' => $code,
- 'client_id' => $this->strategy['client_id'],
- 'client_secret' => $this->strategy['client_secret'],
- 'redirect_uri' => $this->strategy['redirect_uri'],
- 'grant_type' => 'authorization_code'
- );
- $response = $this->serverPost($url, $params, null, $headers);
-
- $results = json_decode($response);
-
- if (!empty($results) && !empty($results->access_token)){
- $userinfo = $this->userinfo($results->access_token);
-
- $this->auth = array(
- 'uid' => $userinfo['id'],
- 'info' => array(),
- 'credentials' => array(
- 'token' => $results->access_token,
- 'expires' => date('c', time() + $results->expires_in)
- ),
- 'raw' => $userinfo
- );
- if (!empty($results->refresh_token))
- {
- $this->auth['credentials']['refresh_token'] = $results->refresh_token;
- }
-
- $this->mapProfile($userinfo, 'name', 'info.name');
- $this->mapProfile($userinfo, 'email', 'info.email');
- $this->mapProfile($userinfo, 'given_name', 'info.first_name');
- $this->mapProfile($userinfo, 'family_name', 'info.last_name');
- $this->mapProfile($userinfo, 'picture', 'info.image');
-
- $this->callback();
- }
- else{
- $error = array(
- 'code' => 'access_token_error',
- 'message' => 'Failed when attempting to obtain access token',
- 'raw' => array(
- 'response' => $response,
- 'headers' => $headers
- )
- );
- $this->errorCallback($error);
- }
- }
- else{
- $error = array(
- 'code' => 'oauth2callback_error',
- 'raw' => $_GET
- );
-
- $this->errorCallback($error);
- }
- }
-
- /**
- * Queries Google API for user info
- *
- * @param string $access_token
- * @return array Parsed JSON results
- */
- private function userinfo($access_token){
- $userinfo = $this->serverGet('https://www.googleapis.com/oauth2/v1/userinfo', array('access_token' => $access_token), null, $headers);
- if (!empty($userinfo)){
- return $this->recursiveGetObjectVars(json_decode($userinfo));
- }
- else{
- $error = array(
- 'code' => 'userinfo_error',
- 'message' => 'Failed when attempting to query for user information',
- 'raw' => array(
- 'response' => $userinfo,
- 'headers' => $headers
- )
- );
- $this->errorCallback($error);
- }
- }
- }
|