OpenConnect с Apigility, чтобы ответить с JWT - PullRequest
0 голосов
/ 09 июня 2018

Как мне реализовать OpenConnect с Apigility, чтобы получить ответ типа JWT?

Проблема в том, что довольно просто добавить только OAuth2, просто следуя документации Apigility (или *).1005 * это это действительно здорово), но когда дело доходит до того, что JWT, как пример ниже, не так легко найти документацию.

{
  "id": "394a71988caa6cc30601e43f5b6569d52cd7f6df",
  "jti": "394a71988caa6cc30601e43f5b6569d52cd7f6df",
  "iss": "issuer_id",
  "aud": "client_id",
  "sub": "user_id",
  "exp": 1483711650,
  "iat": 1483708050,
  "token_type": "bearer",
  "scope": "onescope twoscope"
}

Итак, это больше вопрос и ответ,поскольку я нигде не нашел ее и потратил почти 2 недели на сбор всей информации, подумал, что это будет полезно для кого-то другого.

Обратите внимание, что JWT состоит из 3 частей:

HEADER.PAYLOAD.SIGNATURE

Первые 2 входят в Base64, в котором вы можете просто использовать, последний является ключом, сгенерированным для проверки.(см. это для более подробной информации).

Решение будет ниже.

1 Ответ

0 голосов
/ 09 июня 2018

Если вы хотите добавить OpenConnect к поддерживаемой встроенной OAuth2 Apigility, чтобы вы получили JWT в качестве ответа, вам следует сделать следующее:

Сначала добавьте эти строкив /config/autoload/global.php

    'zf-oauth2' => [
        'allow_implicit'  => true,
        'access_lifetime' => 28800,
        'enforce_state'   => true,
        'options' => [
            'use_jwt_access_tokens'             => true,
            'store_encrypted_token_string'      => true,
            'use_openid_connect'                => true,
            'issuer'                            => 'issueroftoken.com',
            'id_lifetime'                       => 28800,
            'www_realm'                         => 'Service',
            'token_param_name'                  => 'access_token',
            'token_bearer_header_name'          => 'Bearer',
            'require_exact_redirect_uri'        => true,
            'allow_credentials_in_request_body' => true,
            'allow_public_clients'              => true,
            'always_issue_new_refresh_token'    => true,
            'unset_refresh_token_after_use'     => true,
        ],
    ],

Значимые строки: use_jwt_access_tokens и use_openid_connect, которые должны быть установлены в true, и issuer, которые должны быть заполнены (я добавил свой веб-сайтадрес).Остальные можно удалить, если вы не хотите изменять их значения по умолчанию .

Тогда вам нужно будет создать эту таблицу (эту информацию можно найти здесь ):

CREATE TABLE oauth_public_keys (
  client_id            VARCHAR(80),
  public_key           VARCHAR(2000),
  private_key          VARCHAR(2000),
  encryption_algorithm VARCHAR(100) DEFAULT 'RS256'
)

Эта таблица будет использоваться для хранения одного ключа для каждого клиента, который вы должны сгенерировать, выполнив команду (нашел этот здесь ):

# private key
$ openssl genrsa -out privkey.pem 2048

# public key
$ openssl rsa -in privkey.pem -pubout -out pubkey.pem

Затем вы должны взять содержимое этих файлов и заполнить public_key и private_key вместе с client_id.

Мои токены доступа генерируются на oauth_access_tokens, потому что я использую неявный типГрант (нет client_secret на oauth_clients и флаг allow_implicit на global.php), поэтому мне нужно было увеличить поле access_token, вам может понадобиться проверить, сколько символов используются в поле (ах), которое вы используетеиметь:

ALTER TABLE `oauth_access_tokens` CHANGE `access_token` `access_token` VARCHAR(2000) NOT NULL;

Так и должно быть!Теперь вы должны получить JWT в ответ от Apigility!

Надеюсь, это поможет.

...