diff options
author | Frederic Guillot <fred@kanboard.net> | 2015-08-23 13:15:59 -0400 |
---|---|---|
committer | Frederic Guillot <fred@kanboard.net> | 2015-08-23 13:15:59 -0400 |
commit | 8eb739bb910fb91737c6ce65f244eb9a3ac8f35c (patch) | |
tree | db615be44d945a8dc1880a1238a381ec6534dfa2 /app/Auth | |
parent | 297c11e48e1cf18e5773a7463721d862dfd6063d (diff) |
Add Gitlab authentication
Diffstat (limited to 'app/Auth')
-rw-r--r-- | app/Auth/Gitlab.php | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/app/Auth/Gitlab.php b/app/Auth/Gitlab.php new file mode 100644 index 00000000..336152a5 --- /dev/null +++ b/app/Auth/Gitlab.php @@ -0,0 +1,122 @@ +<?php + +namespace Auth; + +use Event\AuthEvent; + +/** + * Gitlab backend + * + * @package auth + */ +class Gitlab extends Base +{ + /** + * Backend name + * + * @var string + */ + const AUTH_NAME = 'Gitlab'; + + /** + * OAuth2 instance + * + * @access private + * @var \Core\OAuth2 + */ + private $service; + + /** + * Authenticate a Gitlab user + * + * @access public + * @param string $gitlab_id Gitlab user id + * @return boolean + */ + public function authenticate($gitlab_id) + { + $user = $this->user->getByGitlabId($gitlab_id); + + if (! empty($user)) { + $this->userSession->refresh($user); + $this->container['dispatcher']->dispatch('auth.success', new AuthEvent(self::AUTH_NAME, $user['id'])); + return true; + } + + return false; + } + + /** + * Unlink a Gitlab 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, + 'gitlab_id' => '', + )); + } + + /** + * Update the user table based on the Gitlab profile information + * + * @access public + * @param integer $user_id User id + * @param array $profile Gitlab profile + * @return boolean + */ + public function updateUser($user_id, array $profile) + { + $user = $this->user->getById($user_id); + + return $this->user->update(array( + 'id' => $user_id, + 'gitlab_id' => $profile['id'], + 'email' => $profile['email'] ?: $user['email'], + 'name' => $profile['name'] ?: $user['name'], + )); + } + + /** + * Get OAuth2 configured service + * + * @access public + * @return \Core\OAuth2 + */ + public function getService() + { + if (empty($this->service)) { + $this->service = $this->oauth->createService( + GITLAB_CLIENT_ID, + GITLAB_CLIENT_SECRET, + $this->helper->url->to('oauth', 'gitlab', array(), '', true), + GITLAB_OAUTH_AUTHORIZE_URL, + GITLAB_OAUTH_TOKEN_URL, + array() + ); + } + + return $this->service; + } + + /** + * Get Gitlab profile + * + * @access public + * @param string $code + * @return array + */ + public function getProfile($code) + { + $this->getService()->getAccessToken($code); + + return $this->httpClient->getJson( + GITLAB_API_URL.'user', + array($this->getService()->getAuthorizationHeader()) + ); + } +} |