Authclient OAuth2 авторизация по средством отправки clientId и clientSecret в заголовке запроса

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nirax
Сообщения: 2
Зарегистрирован: 2018.08.07, 14:22

Authclient OAuth2 авторизация по средством отправки clientId и clientSecret в заголовке запроса

Сообщение nirax »

При расширение проекта был разработан отдельный сервис на java, для аутентификации требуется зашифровать clientId и clientSecret в Base64 и отправить в заголовке запроса. Как с помощью Authclient OAuth2 реализовать такой способ авторизации?

Как добавить в заголовок запроса что то подобное:

Код: Выделить всё

Authorization: Basic YhJEioIdDkRloDRqXPcsRZfvywEdCd==
?

Я смотрел документацию, но не нашел ни чего подобного, при использовании authenticateUser(), clientId и clientSecret отправляются в теле запроса, в следствии чего авторизация не проходит.

Отказаться от шифрования нет возможности. Буду рад любым советам как реализовать такой способ авторизации на Yii2.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Authclient OAuth2 авторизация по средством отправки clientId и clientSecret в заголовке запроса

Сообщение yiijeka »

Посмотрите \yii\filters\auth\HttpBasicAuth вам нужно всего то поменять там

$response->getHeaders()->set('WWW-Authenticate', "Basic realm=\"{$this->realm}\"");

на

$response->getHeaders()->set('Authorization', "Basic realm=\"{$this->realm}\"");
nirax
Сообщения: 2
Зарегистрирован: 2018.08.07, 14:22

Re: Authclient OAuth2 авторизация по средством отправки clientId и clientSecret в заголовке запроса

Сообщение nirax »

yiijeka писал(а): 2018.08.07, 14:32 Посмотрите \yii\filters\auth\HttpBasicAuth вам нужно всего то поменять там

$response->getHeaders()->set('WWW-Authenticate', "Basic realm=\"{$this->realm}\"");

на

$response->getHeaders()->set('Authorization', "Basic realm=\"{$this->realm}\"");
К сожалению это не помогло, возможно я плохо объяснил, в данный момент при использовании yii2-authclient выполняю следующий код:

Код: Выделить всё

$model = new LoginForm();
if ($model->load(Yii::$app->request->post())) {
    $client = Yii::$app->authClientCollection->getClient('backend');
    try {
        // аутентификация напрямую через имя пользователя и пароль:
        $accessToken = $client->authenticateUser($model->username, $model->password);
    } catch (\Exception $e) {
        // аутентификация завершилась неудачей
        Yii::error($e->getMessage());
}
Отправляется следующий запрос:

Код: Выделить всё

POST http://localhost:8500/uaa/oauth/token
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

grant_type=password&username=*****&password=******&client_id=clietn1&client_secret=***************************************************
Сформированный запрос не подходит для моего api т.к. в заголовке должно еще содержаться:

Код: Выделить всё

Authorization: Basic YhJEioIdDkRloDRqXPcsRZfvywEdCd==
где 'YhJEioIdDkRloDRqXPcsRZfvywEdCd==' это зашифрованные данные clientId и clientSecret в Base64.
Правильный формат запроса должен выглядеть следующим образом:

Код: Выделить всё

POST http://localhost:8500/uaa/oauth/token
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Authorization: Basic YhJEioIdDkRloDRqXPcsRZfvywEdCd==

grant_type=password&username=*****&password=******&scope=front
И пока писал возник еще вопрос, как добавить дополнительный параметр "scope" в тело запроса?
uEhlO4a
Сообщения: 70
Зарегистрирован: 2017.08.12, 19:19

Re: Authclient OAuth2 авторизация по средством отправки clientId и clientSecret в заголовке запроса

Сообщение uEhlO4a »

это не oAuth, это мутант

нужно расширять https://github.com/yiisoft/yii2-authcli ... OAuth2.php
например, этот метод: https://github.com/yiisoft/yii2-authcli ... 2.php#L277

Код: Выделить всё

public function authenticateUser($username, $password, $params = [])
....
        $request = $this->createRequest()
            ->setMethod('POST')
           ->addHeaders(['Authorization' => 'Basic: '. base64('YOUR_STUFF'), 'scope' => 'YOUR_SCOPE']) // <------------ СЮДА
            ->setUrl($this->tokenUrl)
            ->setData(array_merge($defaultParams, $params));
https://github.com/yiisoft/yii2-httpcli ... e.php#L110


п.с.
чтобы добавить в тело

Код: Выделить всё

$client->authenticateUser($model->username, $model->password, ['scope' => 'YOUR_SCOPE']);
Ответить