From 96e94d7a9a075e866ab65d4fbc7a05822352e18f Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 23 Jan 2015 15:52:48 -0800 Subject: [PATCH] Github added to social logins. --- e107_admin/prefs.php | 70 +++++++++------- .../hybridauth/Hybrid/Providers/GitHub.php | 80 +++++++++++++++++++ 2 files changed, 123 insertions(+), 27 deletions(-) create mode 100644 e107_handlers/hybridauth/Hybrid/Providers/GitHub.php diff --git a/e107_admin/prefs.php b/e107_admin/prefs.php index f6cc076de..d01a5c0fb 100644 --- a/e107_admin/prefs.php +++ b/e107_admin/prefs.php @@ -1469,6 +1469,27 @@ $social_logins = array ( "AOL" => array ( "enabled" => true ), + + "Facebook" => array ( + "enabled" => true, + "keys" => array ( "id" => "", "secret" => "" ), + "trustForwarded" => false, + // A comma-separated list of permissions you want to request from the user. See the Facebook docs for a full list of available permissions: http://developers.facebook.com/docs/reference/api/permissions. + "scope" => "", + + // The display context to show the authentication page. Options are: page, popup, iframe, touch and wap. Read the Facebook docs for more details: http://developers.facebook.com/docs/reference/dialogs#display. Default: page + "display" => "" + ), + + "Foursquare" => array ( + "enabled" => true, + "keys" => array ( "id" => "", "secret" => "" ) + ), + + "Github" => array ( + "enabled" => true, + "keys" => array ( "key" => "", "secret" => "" ) + ), "Google" => array ( "enabled" => true, @@ -1476,42 +1497,36 @@ $social_logins = array ( "scope" => "" ), - "Facebook" => array ( + "LinkedIn" => array ( "enabled" => true, - "keys" => array ( "id" => "", "secret" => "" ), - - // A comma-separated list of permissions you want to request from the user. See the Facebook docs for a full list of available permissions: http://developers.facebook.com/docs/reference/api/permissions. - "scope" => "", - - // The display context to show the authentication page. Options are: page, popup, iframe, touch and wap. Read the Facebook docs for more details: http://developers.facebook.com/docs/reference/dialogs#display. Default: page - "display" => "" + "keys" => array ( "key" => "", "secret" => "" ) ), + + // windows live + "Live" => array ( + "enabled" => true, + "keys" => array ( "id" => "", "secret" => "" ) + ), + + + "MySpace" => array ( + "enabled" => true, + "keys" => array ( "key" => "", "secret" => "" ) + ), + "Twitter" => array ( "enabled" => true, "keys" => array ( "key" => "", "secret" => "" ) ), + + - // windows live - "Live" => array ( - "enabled" => true, - "keys" => array ( "id" => "", "secret" => "" ) - ), + - "MySpace" => array ( - "enabled" => true, - "keys" => array ( "key" => "", "secret" => "" ) - ), + - "LinkedIn" => array ( - "enabled" => true, - "keys" => array ( "key" => "", "secret" => "" ) - ), - - "Foursquare" => array ( - "enabled" => true, - "keys" => array ( "id" => "", "secret" => "" ) - ) + ); @@ -1523,7 +1538,8 @@ $social_external = array( "Google" => "https://code.google.com/apis/console/", "Live" => "https://manage.dev.live.com/ApplicationOverview.aspx", "LinkedIn" => "https://www.linkedin.com/secure/developer", - "Foursquare" => "https://www.foursquare.com/oauth/" + "Foursquare" => "https://www.foursquare.com/oauth/", + "Github" => "https://github.com/settings/applications/new", ); diff --git a/e107_handlers/hybridauth/Hybrid/Providers/GitHub.php b/e107_handlers/hybridauth/Hybrid/Providers/GitHub.php new file mode 100644 index 000000000..00b35f2a9 --- /dev/null +++ b/e107_handlers/hybridauth/Hybrid/Providers/GitHub.php @@ -0,0 +1,80 @@ + public read-only access (includes public user profile info, public repo info, and gists). + public $scope = ""; + + /** + * IDp wrappers initializer + */ + function initialize() + { + parent::initialize(); + + // Provider api end-points + $this->api->api_base_url = "https://api.github.com/"; + $this->api->authorize_url = "https://github.com/login/oauth/authorize"; + $this->api->token_url = "https://github.com/login/oauth/access_token"; + } + + /** + * load the user profile from the IDp api client + */ + function getUserProfile() + { + $data = $this->api->api( "user" ); + + if ( ! isset( $data->id ) ){ + throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 ); + } + + $this->user->profile->identifier = @ $data->id; + $this->user->profile->displayName = @ $data->name; + $this->user->profile->description = @ $data->bio; + $this->user->profile->photoURL = @ $data->avatar_url; + $this->user->profile->profileURL = @ $data->html_url; + $this->user->profile->email = @ $data->email; + $this->user->profile->webSiteURL = @ $data->blog; + $this->user->profile->region = @ $data->location; + + if( empty($this->user->profile->displayName) ){ + $this->user->profile->displayName = @ $data->login; + } + + // request user emails from github api + if( empty($data->email) ){ + try{ + $emails = $this->api->api("user/emails"); + + // fail gracefully, and let apps collect the email if not present + if (is_array($emails)) { + foreach ($emails as $email) { + if ($email instanceof stdClass + && property_exists('primary', $email) + && true === $email->primary + && property_exists('email', $email) + ) { + $this->user->profile->email = $email->email; + break; + } + } + } + } + catch( GithubApiException $e ){ + throw new Exception( "User email request failed! {$this->providerId} returned an error: $e", 6 ); + } + } + + return $this->user->profile; + } +}