JWTDataProvider

JWTDataProvider 是一个插件,适用于使用 JWT 认证的服务。它允许您从外部来源(例如您的另一个服务或第三方 API)获取数据,并将该数据添加到您的 JWT 的有效负载中。

安装

首先,将依赖项添加到您的 Package.swift 文件中。

.package(url: "https://github.com/skelpo/JWTDataProvider.git", .upToNextMajor("0.8.0"))

然后,将 JWTDataProvider 依赖项添加到您希望访问它的任何目标,并更新您的软件包。

配置

创建一个 Config/service.json 配置文件。 首先添加一个空的 services 对象。

{
    "services": {}
}

此对象的条目用于获取服务外部需要存储在访问令牌有效负载中的数据。您可以放置在其中的对象的结构如下所示:

"<service_name>": {
    "url": "https://api.myotherservice.io/...",

    "//": "All the following keys are optional",
    "//": "The method key is case-insensative. It defaults to 'GET'",
    "method": "GET",

    "//": "Defaults to an empty object",
    "body": {...},

    "//": "Defaults to an empty object",
    "header": {"Content-Type": "application/json", ...},

    "//": "The below key defaults to false",
    "requiresAccessToken": false,

    "//": "Defaults to an empty array (will get whole JSON object)",
    "filters": [
        "path",
        "to",
        "json",
        "values"
    ],

    "//": "Defaults to nil",
    "default": "Some empty value of any type"
}

filters 键是一个数组,包含从给定 URL 返回的 JSON 中获取的键路径。 这能够从数组中包含的对象中获取数据。

此配置允许的身份验证目前受到一些限制。它使用用户服务生成的访问令牌与其它服务进行身份验证,因此您只能使用您的用户服务与服务进行身份验证。传递的访问令牌将仅包含基本有效负载,然后在从服务的身份验证路由返回之前,会添加额外的数据。

当从外部服务检索数据时,JSON 将添加到访问令牌有效负载中,JSON 值作为值,服务名称作为键。

实现

首先,导入该包

import JWTDataProvider

如果您不需要与您连接的任何服务进行身份验证,那么您可以执行以下操作

var payload: JSON = // Create payload here...
payload = try payload(with: [:])

如果您确实需要使用您的服务之一进行身份验证才能访问它,那么您需要创建一个带有标准有效负载的 JWT,获取并合并有效负载实例的数据,然后使用更新后的有效负载创建另一个 JWT。

var accessTokenData: JSON = myPayload
var accessJwt: JWT = try JWT(/* Init stuff with standard payload */)

accessTokenData = try accessTokenData.mergeFetch(with: [:], accessJwt.createToken())
accessJwt = try JWT(/* Init stuff with updated payload */)

我们在创建和合并有效负载数据时传递的字典用于设置服务 url 值中的占位符。 例如,在 service.json 中,我们可能有一个服务通过其 ID 访问服务中的用户,因此 url 键可能如下所示:

https://api.userservice.io/users/{user_id}

当我们在获取有效负载数据时,可以通过传递以下字典来设置 URL 中的 user_id 占位符:

["user_id": myUserId]

然后,JWTDataProvider 会将 URL 中的 user_id 占位符替换为 myUserId 变量中的值。