Как мне реализовать 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"}
Итак, это больше Q&О, поскольку я нигде не нашел ее и потратил почти 2 недели на то, чтобы собрать всю информацию сам, подумал, что это будет полезно для кого-то другого.
Обратите внимание, что JWT состоит из 3 частей:
HEADER.PAYLOAD.SIGNATURE
Первые 2 приходят в Base64, в котором вы можете просто использовать, последний является ключом, созданным для проверки. (увидеть этот Больше подробностей).
Решение будет ниже.
Если вы хотите добавить 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!
Надеюсь это поможет.
Других решений пока нет …