0

如何使用 Apigility 实现 OpenConnect 以通过 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

前两个来自 Base64,您可以在其中使用,最后一个是为验证生成的密钥。(有关详细信息,请参阅此内容)。

解决方案如下。

4

1 回答 1

1

如果您想将 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,
        ],
    ],

重要的行必须设置为 true 并且use_jwt_access_tokens必须填写(我添加了我的网站地址)。如果您不想更改它们的默认值,可以删除其余部分。use_openid_connectissuer

然后您需要创建此表(在此处找到此信息):

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_keyprivate_keyclient_id.

我的访问令牌正在生成,oauth_access_tokens因为我使用的是隐式类型授权(不client_secret启用oauth_clientsallow_implicitglobal.php 上的标志),所以我需要增加access_token字段,您可能需要检查您的字段有多少字符使用有:

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

应该是这样!您现在应该从 Apigility 获得 JWT 作为答案!

希望这可以帮助。

于 2018-06-09T00:17:11.120 回答