Ocelot支持在运行时通过一个认证的Http API修改配置。有两种方式对其验证, 使用Ocelot的内置IdentityServer
(仅用于向管理API验证请求)或将管理API验证挂接到您自己的IdentityServer
中。
如果要使用管理API,您需要做的第一件事就是引入相关的NuGet软件包。
Install-Package Ocelot.Administration
这将使管理API所需的一切减少。
提供你自己的IdentityServer
挂接到你自己的IdentityServer
,你只需要添加一下代码到你的ConfigureServices
方法中。
public virtual void ConfigureServices(IServiceCollection services)
{
Action<IdentityServerAuthenticationOptions> options = o => {
// o.Authority = ;
// o.ApiName = ;
// etc....
};
services
.AddOcelot()
.AddAdministration("/administration", options);
}
您现在需要从你的IdentityServer
获取令牌,并在后续请求Ocelot
的管理API时使用。
这个功能是对问题 228 的实现。这个功能很有用,因为IdentityServer
认证中间件需要IdentityServer
的URL。 如果您使用内置IdentityServer
,则可能无法获得Ocelot URL。
内置IdentityServer
管理API使用您从Ocelot请求的持票人令牌进行身份验证。这是由我已经使用了几年的非常了不起的Identity Server项目提供的。 您可以去看一下。
为了启用管理部分,您需要做一些操作。 首先将此添加到您的初始化文件Startup.cs
中。
管理路径可以是任何值,显然不能使用将要通过Ocelot
路由的url
,因为这是行不通的。管理功能使用asp.net cor
e的MapWhen
功能,并且所有到{root}/administration
的请求将被发送到那里,而不是Ocelot中间件。
secret
是Ocelot
内置IdentityServer
用于验证对管理API请求的客户端密钥。你可以随意填写!
public virtual void ConfigureServices(IServiceCollection services)
{
services
.AddOcelot()
.AddAdministration("/administration", "secret");
}
为了使管理API起作用,Ocelot / IdentityServer必须能够调用自身进行验证。 这意味着如果不是默认值,则需要将Ocelot的基本URL添加到全局配置(http://localhost:5000
)。 请注意,如果您使用的是诸如docker之类的主机来托管Ocelot,则它可能无法回调至localhost
等,并且您需要知道在这种情况下对docker
网络的处理方式。 无论如何,可以按照以下步骤进行。
如果要在本地在其他主机和端口上运行。
"GlobalConfiguration": {
"BaseUrl": "http://localhost:55580"
}
或者如果Ocelot是通过dns公开的
"GlobalConfiguration": {
"BaseUrl": "http://mydns.com"
}
现在,如果您使用上述配置选项并想要访问API,可以使用解决方案中名为ocelot.postman_collection.json
的postman
脚本来更改Ocelot配置。 显然,如果Ocelot运行在不同与http://localhost:5000
的URL上,则需要改一下。
这些脚本向您展示了如何从ocelot请求bearer
令牌,然后使用它来获取现有配置和修改配置。
如果您在群集中运行多个Ocelot
,则需要使用证书对用于访问管理API的bearer
令牌签名。
为了做到这一点,您需要为集群中的每个Ocelot
再添加两个的环境变量。
OCELOT_CERTIFICATE
用于签名令牌的证书路径。 证书必须是X509
类型,显然Ocelot
要能够访问它。
OCELOT_CERTIFICATE_PASSWORD
证书的密码。
通常Ocelot只使用临时签名凭证,但如果您设置了这些环境变量,那么它将使用设置的证书。 如果集群中的所有其他Ocelot都具有相同的证书,那很棒,这样就对了!
管理 API
POST {adminPath}/connect/token
这会使用我们上面讨论的客户端证书得到一个用于管理区域的令牌。 在这种情况下,这将调用Ocelot中托管的IdentityServer。
请求体是from-data
,允许以下数据:
client_id
设置为admin
client_secret
设置为您在设置管理服务时使用的内容
scope
设置为admin
grant_type
设置为client_credentials
GET {adminPath}/configuration
获得当前的Ocelot配置。 这与我们先前设置Ocelot的JSON完全相同。
POST {adminPath}/configuration
这会覆盖现有的配置(可能应该是put更合适!)。 我建议用GET获取您的配置,进行更改后使用此api发回…。
这个请求体的JSON,格式和我们使用文件系统设置Ocelot
的 FileConfiguration.cs
格式相同
请注意,如果要使用此API,则运行Ocelot的进程必须具有写入ocelot.json
或ocelot.{environment} .json
所在磁盘的权限。 这是因为Ocelot将在保存时覆盖它们。
DELETE {adminPath}/outputcache/{region}
这将清空特定区域的缓存。如果您使用空白region
,它将清除缓存的所有实例!赋予您运行Ocelots
集群,并将其全部缓存在内存中,并同时清除所有缓存(仅使用分布式缓存)的能力。
region
是您在Ocelot
配置的FileCacheOptions
部分中针对region
字段设置的内容。