Как интегрировать клиент Google PHP API с просветом и углом? - PullRequest
0 голосов
/ 13 сентября 2018

Я использую Lumen 5.1, Angular 6 и Google PHP API-клиент ^ 2.0. Я пытаюсь использовать Gsuite admin SDK, каталог API. Я не использую jwt, когда пользователь входит в систему, он получает x-session

В настоящее время LoginAction.php выглядит так

private function loginUser()
{
    if ($this->request->input('token') != null) {
        $user_token = UserDevice::where('token', $this->request->input('token'))->with('user')->first();
        if ($user_token != null) {
            $username = $user_token->user->username;
        } else {
            $this->response->addErrorDialog('framework::auth.general.login_token_invalid');
            return $this->response->statusFail();
        }
    } else {
        $username = $this->username;
    }

    $credentials = array(
        'username' => $username,
        'password' => $this->request->input('password')
    );

    if (!$this->checkFailedLogin($credentials["username"])) {
        $this->updateFailedLogin($credentials["username"]);
        $this->response->addErrorDialog('framework::auth.general.login_attempts_reached');
        return $this->response->statusFail('You reached the maximum number of login attempts!');
    }

    if (\Auth::attempt($credentials)) {

        $user = \Auth::user();

        $requiredResourceId = null;
        $requiredRole = $this->request->input('role', null);
        if ($requiredRole != null) {
            if (!$user->inRole($requiredRole)) {
                $this->response->addErrorDialog('framework::auth.general.login_failed');
                return $this->response->statusFail();
            }
            $resourceIds = $user->getResourceId($requiredRole);
            $minLevel = 1000;
            foreach ($resourceIds as $resourceId) {
                if ($resourceId->level < $minLevel) {
                    $minLevel = $resourceId->level;
                    $requiredResourceId = $resourceId->resource_id;
                    $requiredRole = $resourceId->name;
                }
            }

            \Session::put('resource_id', $requiredResourceId);
            \Session::put('role', $requiredRole);
        }

        $should_validate = 0;
        if (config('auth.email_verification') && $user->validated == 0) {
            $this->response->addErrorDialog('framework::auth.general.email_confirmation_required', '');
            $should_validate = BaseAction::EMAIL_VALIDATION_ONLY;
        }

        // update last login
        $this->updateLastLogin($user);
        $this->loadRelations($user);
        $this->resetLoginAttempts($user);

        // Signout from other devices if necessary
        if (!config('auth.multiple_sessions_per_user')) {
            $this->signoutDevices($user);
        }

        if (\Session::has('device_id')) {
            $this->attachDevice($user, \Session::get('device_id'));
        }

        $this->user = $user;

        $userdevice = UserDevice::firstOrCreate([
            'user_id' => $this->user->id,
            'device_id' => \Session::get('device_id')
        ]);

        if (config('auth.device_validation') && $userdevice->validated == 0) {
            $this->response->addErrorDialog('framework::auth.general.email_confirmation_required', '');
            $should_validate = BaseAction::EMAIL_VALIDATION_ONLY;
        }

        $user_remember_token = null;
        $passcode = null;
        if ($this->request->get('remember_user', 0) == 1) {
            $remember_token = str_random(100);
            $passcode = str_random(100);
            $mask = preg_replace("/\S/", "*", $this->user->username);
            $mask = substr($mask, 1, -1);
            $masked_user = substr_replace($this->user->username, $mask, 1, -1);
            $user_remember_token = $masked_user . ':' . $remember_token;
            $userdevice->token = $user_remember_token;
            $userdevice->passcode = $passcode;
            $userdevice->save();
        }

        return $this->response->statusOk([
            'user' => $user,
            'role' => $requiredRole,
            'resource_id' => $requiredResourceId,
            'should_validate' => $should_validate,
            'remember_token' => $user_remember_token,
            'passcode' => $passcode
        ]);
    } else {
        $this->updateFailedLogin($credentials["username"]);
        $this->response->addErrorDialog('framework::auth.general.login_failed');
        return $this->response->statusFail('framework::auth.general.login_failed');
    }
}

Google API должен быть реализован так

<?php require ("vendor/autoload.php");
//Step 1: Enter you google account credentials

$g_client = new Google_Client();

$g_client->setClientId("635746243599-n4uqgio77g1lgbkgkmjajoogd49o7e7k.apps.googleusercontent.com");
$g_client->setClientSecret("Hgq0sN65ue-0E4dyGsS0WZlJ");
$g_client->setRedirectUri("http://localhost/sign_in/google.php");
$g_client->setScopes("email");

//Step 2 : Create the url
$auth_url = $g_client->createAuthUrl();
echo "<a href='$auth_url'>Login Through Google </a>";

//Step 3 : Get the authorization  code
$code = isset($_GET['code']) ? $_GET['code'] : NULL;

//Step 4: Get access token
if(isset($code)) {

    try {

        $token = $g_client->fetchAccessTokenWithAuthCode($code);
        $g_client->setAccessToken($token);

    }catch (Exception $e){
        echo $e->getMessage();
    }




    try {
        $pay_load = $g_client->verifyIdToken();


    }catch (Exception $e) {
        echo $e->getMessage();
    }

} else{
    $pay_load = null;
}

if(isset($pay_load)){

// do something 

}

Как реализовать гугл в loginAction.php? Я не могу просто взять токен и предположить, что он пришел с сервера.

По сути, это одна из проблем, я не могу найти пример того, как интегрировать Google Api с существующим приложением lumen.

Вторая проблема, с которой я столкнулся, заключается в том, что я не знаю, как это назвать с помощью angular, я успешно angular social login , но я чувствую, что мне это не нужно, думаю, мне следует подписаться на него, как я, чтобы войти, но я не уверен.

Нужно ли реализовывать google api из бэкэнда и внешнего интерфейса? Или только бэкэнд и подписаться на ответ от внешнего интерфейса? Библиотеки, подобные той, которую я использовал, не нужны?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...