在这篇博文中,我将概述如何在sapapi管理的帮助下实现粗粒度的访问控制。代码示例可以在serban petrescu/sapim scopes GitHub存储库中找到。关于如何启动和运行的说明可以在存储库的readme文件中找到。如果您不能更改API本身,API管理器可能是实现这一点的可行解决方案。
一般来说,依赖其他机制来创建令牌本身是一个好主意,例如SCP NEO OAuth服务或SCP CF XSUAA服务。只有在API管理上执行访问控制。
在cloud foundry的情况下,您甚至可以通过API Manager路由服务强制所有对应用程序的请求通过API Manager。因此,您可能会考虑集中处理一组微服务的交叉问题,数据挖掘和大数据,而不是将此逻辑扩展到每个微服务。
访问控制
访问控制可以归结为三个大组件:
身份验证:传入的请求必须经过身份验证。当我们谈论OAuth时,这将转换为"请求必须附加OAuth令牌"。粗粒度:请求者必须能够访问他用于请求的URL/动词。在OAuth中,我们可以使用作用域对这些权限进行建模。例如,可以说,如果您有一个"ReadBooks"范围,您可以发出"GET/books"HTTP请求。细粒度:请求者必须能够访问他想要使用的每个资源。例如,跨国公司的欧洲区域经理可能无法访问北美员工的员工信息。这也可以通过OAuth通过声明(~属性)进行建模。
我们将在下一章讨论粗粒度访问控制以及如何使用API管理器实现它。
JSON Web令牌
我们将使用JWT OAuth令牌,它可以被解码以提取OAuth声明,而不必调用授权服务器。这样一个令牌看起来是这样的:
它有三个由点分隔的组件:头、体(包含声明)和签名(用于检查令牌是否由授权服务器真正颁发)。我们对做粗粒度访问控制的主体感兴趣。
头和主体是Base64编码的JSON字符串。使用jwt.io公司结果如下:
我们的示例API代理将保护httpbin.org网站. 我们希望有以下粗粒度的访问控制作用域:
HttpBin.读取:得到httpbin.org/anything/entities/*岗位httpbin.org/anything/entities/searchHttpBin.创建放httpbin.org/anything/entities/*岗位httpbin.org/anything/entities
我们将这些信息(范围-访问控制规则映射-我们将从现在起称之为"规范")存储到键值映射中,以便能够更灵活地配置它。
策略
我们的策略将有四个主要步骤,建模为单个策略:
规范
我们已经看到将有两个步骤规格类型:精确规格(如"POST/entities/search")和"fuzzy"规格(如"GET/entities/*")。为了编写"模糊"的,大数据的应用,我们只需使用RegExp来指定URL。为了覆盖来自自动生成作用域前缀的授权服务器(如XSUAA)的令牌,我还决定允许使用RegExp来匹配作用域。
因此,每个规范都有以下组件:
作用域名称。指示此名称是否准确的标志。URL+动词模式的数组,物联网是什么,每个模式包括:HTTP动词(例如GET、POST)或"*"通配符。它的URL或RegExp。一个标志,指示URL是否精确(即,如果它不是RegExp)。
清单
我们将使用sapim库进行部署,因此我们可以轻松地将规范写入YAML清单文件。库将负责为我们创建一个键值映射。
我们实际上不需要占位符,所以我们不会模板化API代理文件。结果清单如下:
JavaScript
让我们深入研究API代理的核心逻辑:checkScopes JavaScript策略。它依赖于一个.js文件,该文件执行以下步骤:
解析令牌并检索作用域。解析规范并检索所有其他必要的信息(如HTTP动词、url)。检查是否有任何规范与作用域匹配。
对于解析令牌,我们只需执行以下操作:
然后我们需要一个助手函数来检查是否至少有一个OAuth令牌作用域与给定规范匹配:
我们还需要两个助手函数来检查请求路径和谓词是否与规范的模式匹配:
我们可以将所有这些和做一个单独的函数来检查整个访问控制:
最后,将这个函数与从键值映射和上下文变量中检索到的规范相结合,得到JS策略的主体:
Unit
当然,我们要测试我们实现的所有东西。首先,我们在本地对checkScopes JavaScript策略进行单元测试。我们使用Mocha构建测试,大数据收集,并生成一个简单的硬编码OAuth令牌来运行所有测试。
其中一个测试如下:
集成
我们还希望直接在API管理上测试API代理。当然,这种测试也应该是自动的。Postman是使用JavaScript编写此类测试的好工具:
我们将请求分组到单个Postman集合中。API代理的基本路径被指定为Postman变量,这样我们可以在运行测试时动态地填充它。纽曼图书馆是自动运行邮递员收藏的一种非常方便的方式。我们还编写了一个简单的脚本来调用它:
收尾
为了方便起见,高返利页游,我们还编写了一些小的npm脚本来更容易地运行各种操作:
"test":运行Mocha测试。"deploy":使用sapim库部署API代理。"集成":运行邮递员测试。"构建":完成上述所有工作。
我们还将我们的简单存储库与Travis CI集成。首先我们包括以下内容。特拉维斯·伊梅尔文件:
然后我们转到Travis设置,为存储库启用它,并为sapim库添加环境变量:
现在如果我们运行测试构建,我们看到单元测试被执行,然后代理被部署到API管理器,最后集成测试被运行。