Рейтинг:0

Как получить токен jwt текущего пользователя?

флаг ni

В пользовательском модуле мне нужно получить токен jwt (access_token), связанный с текущим пользователем. Следуя этому проблема Я пытался получить его, но безуспешно, потому что get_jwt_key() и jwt_token_params() не определены, и я не могу найти, где они определены:

используйте \Firebase\JWT\JWT;
...    
публичная функция getAccessToken() {
  $uid = \Drupal::currentUser()->id();
  // Добавляем JWT access_token
  $key = get_jwt_key(); // ключ для генерации токена jwt
  $токен = jwt_token_params($uid); // параметры, которые нужно добавить в токен.
  $access_token = JWT::encode($токен, $ключ);
  вернуть $access_token;
}

Я пробовал только с:

$access_token = $this->jwtAuth->generateToken();

Но я не нашел, как инициализировать службу $jwtAuth для создания токена. Любое предложение?

Рейтинг:2
флаг us

Код, указанный в комментарии #2 в Получите носитель токена с помощью модуля JWT после входа в систему. это код для класса подписчика событий. Чего этот комментарий не показывает, так это определения службы подписки на события.

Как описано в Подписка и отправка событий / События Drupal 8, файл .services.yml должен содержать строки, подобные следующим. (Заменять ВАШ МОДУЛЬ с именем машины модуля и ТВОЙ КЛАСС с именем класса.)

Сервисы:
  ВАШ МОДУЛЬ_ВАШ КЛАСС:
    класс: '\Drupal\YOURMODULE\Listener\YOURCLASS'
    теги:
      - {имя: 'event_subscriber'}
    аргументы:
      - '@path.current'
      - '@jwt.authentication.jwt'

Вопреки тому, что говорится в комментарии, файл, содержащий \Drupal\ВАШ МОДУЛЬ\Слушатель\ВАШ КЛАСС класс не тот src/Listener/yourfile.php файл, но src/Listener/ВАШ КЛАСС.php файл, находящийся в каталоге модуля.

В качестве примечаний:

  • Как описано в События, файл, содержащий класс подписчика событий, не обязательно должен находиться в определенном каталоге. Базовые модули Drupal обычно помещают эти файлы в EventSubscriber каталог.

  • Аутентификация веб-токена JSON (JWT) модуль не определяет ни получить_jwt_key() ни jwt_token_params(). В комментарии не показан код этих функций, но их нужно реализовать из модуля. (В этом случае их имена должны начинаться с префикса машинного имени модуля.) -The ТВОЙ КЛАСС класс, показанный в этом комментарии, инициализирует $это->jwtAuth в его конструкторе, но onHttpLoginResponse() даже не использует его.

    /**
     * Добавить токен доступа JWT в ответ API входа пользователя.
     */
    общедоступная функция onHttpLoginResponse (FilterResponseEvent $event) {
      // Остановить, если нет запроса входа пользователя
      если ($this->currentPath->getPath() !== '/user/login') {
        возвращаться;
      }
      // Получить ответ
      $ответ = $event->getResponse();
      // Убедитесь, что ответ не ошибочный
      если ($ответ->getStatusCode() !== 200) {
        возвращаться;
      }
      // Получить запрос
      $запрос = $event->getRequest();
      // Пока просто обрабатываем формат JSON
      если ($запрос->запрос->получить('_format') !== 'json') {
        возвращаться;
      }
      // Декодируем и добавляем токен JWT
      если ($content = $response->getContent()) {
        если ($декодированный = Json::decode($content)) {
          $uid = $decoded['current_user']['uid'];
          // Добавляем JWT access_token
          $key = get_jwt_key(); // ключ для генерации токена jwt
          $токен = jwt_token_params($uid); // параметры, которые нужно добавить в токен.
          $access_token = JWT::encode($токен, $ключ);
          $decoded['jwt_access_token'] = $access_token;
          // Установить новый ответ JSON
          $response->setContent(Json::encode($decoded));
          $event->setResponse($response);
        }
      }
    } 
    

    Очевидно, код, показанный в этом комментарии, неполный.

флаг ni
Спасибо за вашу помощь. После прочтения и некоторых тестов я сделал это следующим образом: $jwt = \Drupal::service('jwt.authentication.jwt'); $access_token = $jwt->generateToken();

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.