macro('impersonate', function (Tenant $tenant, string $userId, string $redirectUrl, string $authGuard = null): ImpersonationToken { return ImpersonationToken::create([ 'tenant_id' => $tenant->getTenantKey(), 'user_id' => $userId, 'redirect_url' => $redirectUrl, 'auth_guard' => $authGuard, ]); }); } /** * Impersonate a user and get an HTTP redirect response. * * @param string|ImpersonationToken $token * @return RedirectResponse */ public static function makeResponse($token): RedirectResponse { $token = $token instanceof ImpersonationToken ? $token : ImpersonationToken::findOrFail($token); if (((string) $token->tenant_id) !== ((string) tenant('id'))) { abort(403); } if ($token->created_at->diffInSeconds(Carbon::now()) > static::$ttl) { abort(403); } Auth::guard($token->auth_guard)->loginUsingId($token->user_id); $token->delete(); return redirect($token->redirect_url); } }