%PDF- %PDF-
Direktori : /www/varak.net/paste.varak.net-5.6/app/lib/auth/ |
Current File : //www/varak.net/paste.varak.net-5.6/app/lib/auth/StickyNotesOAuthUserProvider.php |
<?php namespace StickyNotes\Auth; /** * Sticky Notes * * An open source lightweight pastebin application * * @package StickyNotes * @author Sayak Banerjee * @copyright (c) 2014 Sayak Banerjee <mail@sayakbanerjee.com> * @license http://www.opensource.org/licenses/bsd-license.php * @link http://sayakbanerjee.com/sticky-notes * @since Version 1.0 * @filesource */ use App; use Auth; use Cache; use Config; use Cookie; use Input; use Redirect; use Site; use Illuminate\Auth\UserInterface; use Illuminate\Auth\UserProviderInterface; use Illuminate\Database\Connection; use OAuth\Common\Consumer\Credentials; use OAuth\Common\Storage\Session; use OAuth\OAuth2\Service\Google; use OAuth\ServiceFactory; /** * StickyNotesOAuthUserProvider Class * * This class handles oAuth authentication. * * @package StickyNotes * @subpackage Drivers * @author Sayak Banerjee */ class StickyNotesOAuthUserProvider implements UserProviderInterface { /** * The Eloquent user model. * * @var Illuminate\Database\Eloquent\Model */ protected $model; /** * Authentication configuration. * * @var array */ protected $auth; /** * Initializes the provider and sets the model instance * * @return void */ public function __construct() { $this->model = Config::get('auth.model'); $this->auth = Site::config('auth'); } /** * Retrieve a user by their unique identifier. * * @param mixed $identifier * @return \Illuminate\Auth\UserInterface|null */ public function retrieveById($identifier) { return $this->createModel()->newQuery()->find($identifier); } /** * Retrieve a user by by their unique identifier and "remember me" token. * * @param mixed $identifier * @param string $token * @return \Illuminate\Auth\UserInterface|null */ public function retrieveByToken($identifier, $token) { $model = $this->createModel(); return $model->newQuery() ->where($model->getKeyName(), $identifier) ->where($model->getRememberTokenName(), $token) ->first(); } /** * Update the "remember me" token for the given user in storage. * * @param \Illuminate\Auth\UserInterface $user * @param string $token * @return void */ public function updateRememberToken(UserInterface $user, $token) { $user->setAttribute($user->getRememberTokenName(), $token); $user->save(); } /** * Retrieve a user by the given credentials. * * @param array $credentials * @return \Illuminate\Auth\UserInterface|null */ public function retrieveByCredentials(array $credentials) { require_once base_path().'/vendor/lusitanian/OAuth/bootstrap.php'; $url = url('/'); if ( ! empty($this->auth->oauthGoogleId) AND ! empty($this->auth->oauthGoogleSecret)) { // Setup the credentials for the requests $credentials = new Credentials( $this->auth->oauthGoogleId, $this->auth->oauthGoogleSecret, url('user/login') ); // Session storage $storage = new Session(); // Instantiate the Google service using the credentials, http client and storage mechanism for the token $service = new ServiceFactory(); $google = $service->createService('google', $credentials, $storage, array('userinfo_email', 'groups_provisioning')); // Google responded with a code if (Input::has('code')) { // This was a callback request from google, get the token $google->requestAccessToken(Input::get('code')); // Send a request with it $result = json_decode($google->request(Site::config('services')->googleUrlOAuth), TRUE); // Process user if (is_string($result['id']) AND is_string($result['email']) AND isset($result['verified_email'])) { if ($result['verified_email']) { // First we will add each credential element to the query as a where clause. // Then we can execute the query and, if we found a user, return it in a // Eloquent User "model" that will be utilized by the Guard instances. $query = $this->createModel()->newQuery(); // We search by email and user type. A filter for type=oauth is added to avoid // getting users created by other auth methods $query->where('email', $result['email'])->where('type', 'oauth'); // If a user is not found, we need to create one automagically // Thats why even if count is 0, we return a new model instance $user = $query->count() > 0 ? $query->first() : $this->createModel(); // Determine if user is an admin $googleAdmins = explode("\n", $this->auth->oauthGoogleAdmins); $isAdmin = in_array($result['email'], $googleAdmins); // We extract the username from the email address of the user $parts = explode('@', $result['email']); // Insert/Update user info $user->username = $parts[0]; $user->password = ''; $user->salt = ''; $user->email = $result['email']; $user->type = 'oauth'; $user->active = 1; $user->admin = $isAdmin; $user->save(); // Log the user in. We need to do it manually because we don't have an username // that we can 'attempt' to log in. Auth::login($user); return $user; } } App::abort(401); // Unauthorized } // We redirect the user to Google else { $url = $google->getAuthorizationUri()->getAbsoluteUri(); } } App::after(function($request, $response) use ($url) { $response->headers->set('Location', $url); }); return NULL; } /** * Validate a user against the given credentials. * * @param \Illuminate\Auth\UserInterface $user * @param array $credentials * @return bool */ public function validateCredentials(UserInterface $user, array $credentials) { return FALSE; } /** * Create a new instance of the model. * * @return \Illuminate\Database\Eloquent\Model */ private function createModel() { $class = '\\'.ltrim($this->model, '\\'); return new $class; } }