Example #1
0
 /**
  * @return string
  * @throws \DreamFactory\Core\Exceptions\UnauthorizedException
  */
 public static function refreshToken()
 {
     $token = Session::getSessionToken();
     try {
         $newToken = \JWTAuth::refresh($token);
         $payload = \JWTAuth::getPayload($newToken);
         $userId = $payload->get('user_id');
         $user = User::find($userId);
         $userInfo = $user->toArray();
         ArrayUtils::set($userInfo, 'is_sys_admin', $user->is_sys_admin);
         Session::setSessionToken($newToken);
         Session::setUserInfo($userInfo);
         static::setTokenMap($payload, $newToken);
     } catch (TokenExpiredException $e) {
         $payloadArray = \JWTAuth::manager()->getJWTProvider()->decode($token);
         $forever = boolval(ArrayUtils::get($payloadArray, 'forever'));
         if ($forever) {
             $userId = ArrayUtils::get($payloadArray, 'user_id');
             $user = User::find($userId);
             Session::setUserInfoWithJWT($user, $forever);
         } else {
             throw new UnauthorizedException($e->getMessage());
         }
     }
     return Session::getSessionToken();
 }
Example #2
0
 /**
  * @param Request  $request
  * @param \Closure $next
  *
  * @return array|mixed|string
  */
 public function handle(Request $request, \Closure $next)
 {
     if (!in_array($route = $request->getPathInfo(), ['/setup', '/setup_db'])) {
         try {
             $apiKey = static::getApiKey($request);
             Session::setApiKey($apiKey);
             $appId = App::getAppIdByApiKey($apiKey);
             //Get the JWT.
             $token = static::getJwt($request);
             Session::setSessionToken($token);
             //Check for basic auth attempt.
             $basicAuthUser = $request->getUser();
             $basicAuthPassword = $request->getPassword();
             if (!empty($basicAuthUser) && !empty($basicAuthPassword)) {
                 //Attempting to login using basic auth.
                 Auth::onceBasic();
                 /** @var User $authenticatedUser */
                 $authenticatedUser = Auth::user();
                 if (!empty($authenticatedUser)) {
                     $userId = $authenticatedUser->id;
                     Session::setSessionData($appId, $userId);
                 } else {
                     throw new UnauthorizedException('Unauthorized. User credentials did not match.');
                 }
             } elseif (!empty($token)) {
                 //JWT supplied meaning an authenticated user session/token.
                 /**
                  * Note: All caught exception from JWT are stored in session variables.
                  * These are later checked and handled appropriately in the AccessCheck middleware.
                  *
                  * This is to allow processing API calls that do not require any valid
                  * authenticated session. For example POST user/session to login,
                  * PUT user/session to refresh old JWT, GET system/environment etc.
                  *
                  * This also allows for auditing API calls that are called by not permitted/processed.
                  * It also allows counting unauthorized API calls against Enterprise Console limits.
                  */
                 try {
                     JWTAuth::setToken($token);
                     /** @type Payload $payload */
                     $payload = JWTAuth::getPayload();
                     JWTUtilities::verifyUser($payload);
                     $userId = $payload->get('user_id');
                     Session::setSessionData($appId, $userId);
                 } catch (TokenExpiredException $e) {
                     JWTUtilities::clearAllExpiredTokenMaps();
                     Session::set('token_expired', true);
                     Session::set('token_expired_msg', $e->getMessage());
                 } catch (TokenBlacklistedException $e) {
                     Session::set('token_blacklisted', true);
                     Session::set('token_blacklisted_msg', $e->getMessage());
                 } catch (TokenInvalidException $e) {
                     Session::set('token_invalid', true);
                     Session::set('token_invalid_msg', 'Invalid token: ' . $e->getMessage());
                 }
             } elseif (!empty($apiKey)) {
                 //Just Api Key is supplied. No authenticated session
                 Session::setSessionData($appId);
             }
             return $next($request);
         } catch (\Exception $e) {
             return ResponseFactory::getException($e, $request);
         }
     }
     return $next($request);
 }
 /**
  * @param Request $request
  * @param Closure $next
  *
  * @return array|mixed|string
  */
 public function handle($request, Closure $next)
 {
     try {
         static::setExceptions();
         //Get the api key.
         $apiKey = static::getApiKey($request);
         Session::setApiKey($apiKey);
         $appId = App::getAppIdByApiKey($apiKey);
         //Get the JWT.
         $token = static::getJwt($request);
         Session::setSessionToken($token);
         //Get the Console API Key
         $consoleApiKey = static::getConsoleApiKey($request);
         //Check for basic auth attempt.
         $basicAuthUser = $request->getUser();
         $basicAuthPassword = $request->getPassword();
         if (config('df.managed') && !empty($consoleApiKey) && $consoleApiKey === Managed::getConsoleKey()) {
             //DFE Console request
             return $next($request);
         } elseif (!empty($basicAuthUser) && !empty($basicAuthPassword)) {
             //Attempting to login using basic auth.
             Auth::onceBasic();
             /** @var User $authenticatedUser */
             $authenticatedUser = Auth::user();
             if (!empty($authenticatedUser)) {
                 $userId = $authenticatedUser->id;
                 Session::setSessionData($appId, $userId);
             } else {
                 throw new UnauthorizedException('Unauthorized. User credentials did not match.');
             }
         } elseif (!empty($token)) {
             //JWT supplied meaning an authenticated user session/token.
             try {
                 JWTAuth::setToken($token);
                 /** @type Payload $payload */
                 $payload = JWTAuth::getPayload();
                 JWTUtilities::verifyUser($payload);
                 $userId = $payload->get('user_id');
                 Session::setSessionData($appId, $userId);
             } catch (TokenExpiredException $e) {
                 JWTUtilities::clearAllExpiredTokenMaps();
                 if (!static::isException($request)) {
                     throw new UnauthorizedException($e->getMessage());
                 }
             } catch (TokenBlacklistedException $e) {
                 throw new ForbiddenException($e->getMessage());
             } catch (TokenInvalidException $e) {
                 throw new BadRequestException('Invalid token: ' . $e->getMessage(), 401);
             }
         } elseif (!empty($apiKey)) {
             //Just Api Key is supplied. No authenticated session
             Session::setSessionData($appId);
         } elseif (static::isException($request)) {
             //Path exception.
             return $next($request);
         } else {
             throw new BadRequestException('Bad request. No token or api key provided.');
         }
         if (static::isAccessAllowed()) {
             return $next($request);
         } elseif (static::isException($request)) {
             //API key and/or (non-admin) user logged in, but if access is still not allowed then check for exception case.
             return $next($request);
         } else {
             if (!Session::isAuthenticated()) {
                 throw new UnauthorizedException('Unauthorized.');
             } else {
                 throw new ForbiddenException('Access Forbidden.');
             }
         }
     } catch (\Exception $e) {
         return ResponseFactory::getException($e, $request);
     }
 }
Example #4
0
 /**
  * @param Request  $request
  * @param \Closure $next
  *
  * @return array|mixed|string
  */
 public function handle(Request $request, \Closure $next)
 {
     if (!in_array($route = $request->getPathInfo(), ['/setup', '/setup_db'])) {
         try {
             $apiKey = static::getApiKey($request);
             Session::setApiKey($apiKey);
             $appId = App::getAppIdByApiKey($apiKey);
             //Get the JWT.
             $token = static::getJwt($request);
             Session::setSessionToken($token);
             //Check for basic auth attempt.
             $basicAuthUser = $request->getUser();
             $basicAuthPassword = $request->getPassword();
             if (!empty($basicAuthUser) && !empty($basicAuthPassword)) {
                 //Attempting to login using basic auth.
                 Auth::onceBasic();
                 /** @var User $authenticatedUser */
                 $authenticatedUser = Auth::user();
                 if (!empty($authenticatedUser)) {
                     $userId = $authenticatedUser->id;
                     Session::setSessionData($appId, $userId);
                 } else {
                     throw new UnauthorizedException('Unauthorized. User credentials did not match.');
                 }
             } elseif (!empty($token)) {
                 //JWT supplied meaning an authenticated user session/token.
                 try {
                     JWTAuth::setToken($token);
                     /** @type Payload $payload */
                     $payload = JWTAuth::getPayload();
                     JWTUtilities::verifyUser($payload);
                     $userId = $payload->get('user_id');
                     Session::setSessionData($appId, $userId);
                 } catch (TokenExpiredException $e) {
                     JWTUtilities::clearAllExpiredTokenMaps();
                     Session::set('token_expired', true);
                     Session::set('token_expired_msg', $e->getMessage());
                 } catch (TokenBlacklistedException $e) {
                     throw new ForbiddenException($e->getMessage());
                 } catch (TokenInvalidException $e) {
                     throw new BadRequestException('Invalid token: ' . $e->getMessage(), 401);
                 }
             } elseif (!empty($apiKey)) {
                 //Just Api Key is supplied. No authenticated session
                 Session::setSessionData($appId);
             }
             return $next($request);
         } catch (\Exception $e) {
             return ResponseFactory::getException($e, $request);
         }
     }
     return $next($request);
 }