Как реализовать OpenConnect с Apigility, чтобы получить ответ типа JWT?
Проблема в том, что довольно просто добавить только OAuth2, следуя Apigility документация (или Вот этот, что действительно здорово), но когда дело доходит до того, чтобы получить этот 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, в котором вы можете просто использовать, последний - это ключ, сгенерированный для проверки. (подробнее см. это).
Решение будет ниже.






Если вы хотите добавить OpenConnect к поддерживаемому встроенному Apigility OAuth2, чтобы получить ответ 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, вам может потребоваться проверить, сколько символов в поле ( s) вы используете:
ALTER TABLE `oauth_access_tokens` CHANGE `access_token` `access_token` VARCHAR(2000) NOT NULL;
Так и должно быть! Теперь вы должны получить JWT в качестве ответа от Apigility!
Надеюсь это поможет.