Задать вопрос

Как добавить в Yii2 — authClient returnUrl поддержку мультиязычности?

Доброго дня!

Есть проект, в котором реализована мультиязычность, по этой статье
Т.е. ссылки имею вид https://site.io/ru/profile | https://site.io/en/profile | etc.

Есть экстеншен Yii2 - authClient.

В настройках для экстеншена есть параметр returnUrl в котором хранится ссылка,
на которую перенаправляется пользователь после удачной авторизации/регистрации.
Но вот в чём проблема, при редиректе на https://site.io/auth?authclient=имя_соц_сети
я получаю ошибку:

Exception – yii\authclient\InvalidResponseException

Request failed with code: 401, 
message: {"error":"invalid_grant","error_description":"Code is invalid or expired."}


А если указать для returnUrl, какой либо язык:
https://site.io/ru/auth?authclient=имя_соц_сети
то всё ок, и ошибок нет. Но языков может быть чуть меньше чем дофига!

Пробовал припилить "костыль", в action который получает returnUrl,
разбивает его, добавляет текущий язык, и запиливает его обратно,
но это не помогло и ошибка всё равно появляется. Вот пример этого костыля:

public function actions() {
    return [
        'auth' => [
            'class' => 'yii\authclient\AuthAction',
            'successCallback' => [$this, 'onAuthSuccess'],
        ],
        ...
    ];
}

public function onAuthSuccess($client) {
    $exploded_url = explode(Yii::$app->request->hostInfo . '/', $client->getReturnUrl());
    $current_lang = Lang::getCurrent();
    $new_return_url = Yii::$app->request->hostInfo . '/' . $current_lang->url . '/' . $exploded_url[1];
    $client->setReturnUrl($new_return_url);

    if ( (new AuthHandler($client))->handle() ) {
        $this->redirect('profile');
    }
}


Что самое забавное, в целом всё работает, т.е. не происходит только редирект.
Если вернуться "назад", и обновить страницу, то видно что авторизация/регистрация
выполнена.

В связи с этим вопрос: Как красиво реализовать поддержку мультиязычность, с корректным редиректом?
P.S. Или я что-то не понимаю?
  • Вопрос задан
  • 2165 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 3
arutyunov
@arutyunov
Mooza.ru — Делаем сайты
Я "переводил" все url с помощью этого расширения: https://github.com/codemix/yii2-localeurls

Любой запрос проходит через urlManager, который переопределен в данном расширении. Автоматически определяется язык для пользователя и выполняется редирект на эту языковую версию. Также можно добавить в "игнор" те шаблоны url, которые не надо обрабатывать и редиректить. Например, /api и пр.
Ответ написан
bitver
@bitver
Почему сначало надо что-то сделать, спросить, а только потом смотреть в документацию?
www.yiiframework.com/doc-2.0/yii-authclient-authac...
Ответ написан
socode
@socode Автор вопроса
Web dev
Если кому-то нужно, вот решение:

public function actions() {
    return [
        'auth' => [
            'class' => 'yii\authclient\AuthAction',
            'successCallback' => [$this, 'onAuthSuccess'],
            'successUrl' => Url::to(['profile/successAuth']),
        ],
        . . .
    ];
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы