您可以使用 tokens 来标识 Pulsar 客户端,以及关联上被授予相应操作权限(例如: 发布到某个 Topic 或从某个 Topic 消费)的 “principal” 或 “role” 上。

通常用户需要从管理员(或某些自动化服务)处获得 token 字符串。

The compact representation of a signed JWT is a string that looks like as the following:

应用程序在创建客户端实例时传入 token。 An alternative is to pass a “token supplier” (a function that returns the token when the client library needs one).

命令行工具 , pulsar-perf 使用 conf/client. onf 配置文件在 Pulsar 安装中。

You need to add the following parameters to that file to use the token authentication with CLI tools of Pulsar:

  1. webServiceUrl=http://broker.example.com:8080/
  2. brokerServiceUrl=pulsar://broker.example.com:6650/
  3. authPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
  4. authParams=token:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY

Token 字符串也可以从文件中读取,例如:

  1. authParams=file:///path/to/token/file

Pulsar 客户端

您可以使用 tokens 对以下 Pulsar 客户端进行身份认证。

Java

Go

C++

C#

  1. PulsarClient client = PulsarClient.builder() .serviceUrl("pulsar://broker.example.com:6650/") .authentication( AuthenticationFactory.token("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY")) .build();

同样,你也可以传入一个 Supplier

    1. from pulsar import Client, AuthenticationTokenclient = Client('pulsar://broker.example.com:6650/' authentication=AuthenticationToken('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY'))

    或者,您也可以通过 Supplier

    1. client, err := NewClient(ClientOptions{ URL: "pulsar://localhost:6650", Authentication: NewAuthenticationToken("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY"),})

    同样,你也可以传入一个 Supplier

    1. #include <pulsar/Client.h>pulsar::ClientConfiguration config;config.setAuth(pulsar::AuthToken::createWithToken("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY"));pulsar::Client client("pulsar://broker.example.com:6650/", config);
    1. var client = PulsarClient.Builder() .AuthenticateUsingToken("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY") .Build();

    启用 Token 认证

    如何在 Pulsar 集群中启用 Token 认证,您可以参考下面的指南。

    JWT 支持两种不同的 keys ,都可以生成和验证 tokens:

    • 对称:
      • 使用单个 Secret key 来生成和验证 tokens。
    • 非对称:包含由私钥和公钥组成的一对密钥。
      • 使用 Private key 生成 tokens。
      • 使用 Public key 验证 tokens。

    当使用 secret key 时,由管理员创建这个 secret key 并使用该密钥生成客户端 tokens。 还需要为 brokers 配置这个密钥,以便验证客户端。

    默认在 Pulsar 安装目录的根目录生成输出文件。 您也可以使用下面的命令为输出文件指定绝对路径。

    1. $ bin/pulsar tokens create-secret-key --output my-secret.key

    使用秘钥对

    使用 Public 和 Private 密钥方式,您需要创建一对密钥。 Pulsar 支持 Java JWT 库( )支持的所有算法。

    默认在 Pulsar 安装目录的根目录生成输出文件。 您也可以使用下面的命令为输出文件指定绝对路径。

    1. $ bin/pulsar tokens create-key-pair --output-private-key my-private.key --output-public-key my-public.key
    • 保存 my-private.key 到一个安全的位置,只有管理员能使用 my-private.key 来生成新的 tokens。
    • my-public.key 需要分发给所有 Pulsar brokers。 您可以公开共享此文件,不用担心安全问题。

    A token is the credential associated with a user. 连接是通过 “principal” 或 “role” 完成的。 对于 JWT tokens,这个字段通常被称为 subject,尽管它们是完全相同的概念。

    接下来,您需要使用这个命令来要求生成的具有一个 subject 字段的 token。

    1. $ bin/pulsar tokens create --secret-key file:///path/to/my-secret.key \
    2. --subject test-user

    命令将在 stdout 上打印出 token 字符串。

    类似地,您可以通过下面的命令使用 “private” key 来创建一个 token。

    1. --subject test-user

    最后,您可以通过以下命令来创建一个带有预定义的 TTL token。 Token 会自动过期失效。

    1. $ bin/pulsar tokens create --secret-key file:///path/to/my-secret.key \
    2. --subject test-user \
    3. --expiry-time 1y

    Authorization

    Token 本身没有关联任何权限。 授权引擎确定 token 是否有权限。 一旦创建 token,就可以授予该 Token 执行某些操作的权限。 The following is an example.

    1. $ bin/pulsar-admin namespaces grant-permission my-tenant/my-namespace \
    2. --actions produce,consume

    要让 brokers 能对客户端进行身份认证,请在 broker.conf 中添加以下参数:

    在 Proxies 上启用 token 认证

    要让 proxies 能对客户端进行身份认证,请在 proxy.conf 中添加以下参数:

    1. # For clients connecting to the proxy
    2. authenticationEnabled=true
    3. authorizationEnabled=true
    4. authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderToken
    5. tokenSecretKey=file:///path/to/secret.key
    6. # For the proxy to connect to brokers
    7. brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
    8. brokerClientAuthenticationParameters=token:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.9OHgE9ZUDeBTZs7nSMEFIuGNEX18FLR3qvy8mqxSxXw
    9. # brokerClientAuthenticationParameters=file:///path/to/proxy-token.txt