lahaxearnaud/laravel-token

View on GitHub
src/Lahaxearnaud/LaravelToken/LaravelTokenServiceProvider.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php namespace Lahaxearnaud\LaravelToken;

use \Event as Event;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\ServiceProvider;
use Lahaxearnaud\LaravelToken\commands\ClearTokenCommand;
use Lahaxearnaud\LaravelToken\exeptions\NotLoginTokenException;
use Lahaxearnaud\LaravelToken\exeptions\TokenNotFoundException;
use Lahaxearnaud\LaravelToken\exeptions\TokenNotValidException;
use Lahaxearnaud\LaravelToken\exeptions\UserNotLoggableByTokenException;
use Lahaxearnaud\LaravelToken\Generator\TokenGenerator;
use Lahaxearnaud\LaravelToken\Repositories\TokenRepository;
use Lahaxearnaud\LaravelToken\Security\TokenCrypt;
use \Route as Route;
use \Auth as Auth;

class LaravelTokenServiceProvider extends ServiceProvider
{

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = false;

    /**
     * Bootstrap the application events.
     *
     * @return void
     */
    public function boot()
    {
        $this->package('lahaxearnaud/laravel-token');
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {

        $this->app->bind('tokenrepository', function () {
            return new TokenRepository(new \Lahaxearnaud\LaravelToken\Models\Token(), new TokenGenerator());
        });

        $app = $this->app;

        $this->app->singleton('token', function () use ($app) {
            return new LaravelToken($app->make('tokenrepository'), new TokenCrypt());
        });

        Route::filter('token', function () use ($app) {
            $tokenManager = $app->make('token');

            $strToken = $tokenManager->getTokenValueFromRequest();
            $strToken = $tokenManager->uncryptToken($strToken);
            try {
                $token = $tokenManager->findByToken($strToken);

                $tokenManager->setCurrentToken($token);

                if (!$tokenManager->isValid($token)) {

                    throw new TokenNotValidException($token);
                }

            } catch (ModelNotFoundException $e) {

                throw new TokenNotFoundException($e);
            }
        });

        Route::filter('token.auth', function () use ($app) {
            $tokenManager = $app->make('token');

            $strToken = $tokenManager->getTokenValueFromRequest();
            $strToken = $tokenManager->uncryptToken($strToken);
            try {
                $token = $tokenManager->findByToken($strToken);

                $tokenManager->setCurrentToken($token);

                if (!$tokenManager->isValid($token)) {

                    throw new TokenNotValidException($token);
                }

                $user = $token->user;

                if ($user === null || !$token->login) {

                    throw new NotLoginTokenException($token);
                }

                if ($user->loggableByToken()) {
                    Auth::login($user);

                    Event::fire('token.logged', array($token, $user));
                } else {

                    throw new UserNotLoggableByTokenException($token, $user);
                }

            } catch (ModelNotFoundException $e) {

                throw new TokenNotFoundException($e);
            }
        });

        $this->app['token.clear'] = $this->app->share(function () {
            return new ClearTokenCommand();
        });

        $this->commands('token.clear');
    }

    /**
     * Get the services provided by the provider.
     *
     * @return string[]
     */
    public function provides()
    {
        return array('token');
    }
}