在这个由三个部分组成的系列文章中,介绍了如何在OAuth 2.0标准下使用IAM简单地为IRIS中的未经验证的服务添加安全性。 

第一部分介绍了一些OAuth 2.0背景知识,以及IRIS和IAM的一些初始定义和配置,以帮助读者理解确保服务安全的整个过程。 

第二部分详细讨论和演示了配置IAM所需的步骤——验证传入请求中的访问令牌,并在验证成功时将请求转发到后端。 

本系列的最后一部分将讨论和演示IAM生成访问令牌(充当授权服务器)并对其进行验证时所需的配置,以及一些重要的最终考虑事项。 

如果您想试用IAM,请联系InterSystems销售代表。 

场景2:IAM作为授权服务器和访问令牌验证器  

与上个场景不同的是,该场景中将使用一个名为“OAuth 2.0 Authentication”的插件。 

如果要在资源所有者密码凭证流中将IAM作为授权服务器使用,客户端应用程序必须对用户名和密码进行身份验证。只有在身份验证成功时,才能发出获取IAM访问令牌的请求。 

首先,将其添加到“SampleIRISService”中。正如下面截屏所示,需要填充一些不同的字段来配置此插件。 

<rect filled="f" id="Retângulo_x0020_15" o:gfxdata="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 SwUGAAAAAAUABQBnAQAAgw0AAAAA " strokecolor="red" strokeweight="1.5pt" style="position:absolute; margin-left:100px; margin-top:248px; width:94.35pt; height:20.75pt; z-index:251659264; v-text-anchor:middle"></rect>首先,将“SampleIRISService”的ID粘贴到“service_id”字段中,这样就可以在服务中启用该插件。 

在“config.auth_header_name”字段中,需要指定携带授权令牌的头名称。本例中,我保留默认值“authorization”。 

“OAuth 2.0 Authentication”插件支持的OAuth 2.0流包括授权码授权(Authorization Code Grant)、客户端凭证(Client Credentials)、隐式授予(Implicit Grant)或资源所有者密码凭证授权(Resource Owner Password Credentials Grant)。我们在本文中使用的是“资源所有者密码凭证”流,故选中“config.enable_password_grant”。 

在“config.provision_key”字段中输入要用作配置密钥的字符串。此值用来向IAM请求访问令牌。 

本例中,我保留了所有其他字段的默认值。可以在此处查看插件文档中每个字段的完整引用。 

下面是插件配置的最终效果: 

创建插件后,需要为“ClientApp”客户端创建凭证。 

为此,打开左侧菜单上的“Consumers”,然后单击“ClientApp”。接下来,点击“Credentials”标签,然后点击“New OAuth 2.0 Application”按钮。 

在下个页面的“name”字段输入名称,以标识应用程序,在“client\_id”和“client\_secret”字段分别定义客户端ID和客户端密钥,最后在应用程序中输入URL,在“redirect_uri”字段上授权后,用户将被发送到该URL。然后,单击“Create”。  

现在,可以发送请求了。 

需要发出的第一个请求是获取IAM访问令牌。“OAuth 2.0 Authentication”插件自动创建一个端点,并将“/oauth2/token”路径附加到已经创建的路由上。 

注意:必须使用HTTPS协议和IAM的代理端口(默认端口为8443)监听TLS/SSL请求。这是OAuth 2.0规范要求。  
因此在本例中,需要向URL发出一个POST请求: **https://iamhost:8443/event/oauth2/token** 请求主体中应包括以下JSON:  
{
   "client_id": "clientid",
   "client_secret": "clientsecret",
   "grant_type": "password",
   "provision_key": "provisionkey",
   "authenticated_userid": "1"
}

如上所示,该JSON包含了在创建“OAuth 2.0 Authentication”插件时定义的值(如“grant_type”和“provision_key”),以及在创建客户端凭证时定义的值(如“client_id”和“client_secret”)。 

当提供的用户名和密码成功通过身份验证后,客户端应用程序还应该添加“authenticated_userid”参数值作为已通过身份验证的用户的唯一标志。 

该请求及其响应如下:

 

现在可以请求从上面的响应中获取事件数据(包括“access_token”值),并作为对URL的GET请求中的“bearner token”   **https://iamhost:8443/event/1**

如果访问令牌过期,可以使用收到的刷新令牌和过期的访问令牌一起生成一个新的访问令牌,方法是向用于获取访问令牌的相同端点发出POST请求,但主体略有不同:  
{
   "client_id": "clientid",
   "client_secret": "clientsecret",
   "grant_type": "refresh_token",
   "refresh_token": "E50m6Yd9xWy6lybgo3DOvu5ktZTjzkwF"
}
 该请求及其响应如下:  

“OAuth 2.0 Authentication”插件的一个有趣很好的特性是能够查看和禁用访问令牌。   若要查看令牌列表,向以下IAM的Admin API终端发送GET请求即可:   **https://iamhost:8444/{workspace\_name}/oauth2\_tokens** 其中{workspace_name}是IAM工作区的名称。如果启用了RBAC,则需要输入必要的凭证才能调用IAM Admin API。  

注意,“credential_id”是在ClientApp客户端内部创建的OAuth应用程序(本例中名为SampleApp)的id,“service_id”是应用此插件的“SampleIRISService”的id。 

要想禁用令牌,可以向以下端点发送删除请求 

**https://iamhost:8444/Sample/oauth2\_tokens/{token\_id}** 其中{token_id}是要禁用的令牌id。  

如果尝试使用无效令牌,将包含该无效令牌的GET请求作为Bearer Token 发送到URL,则会收到一条消息,提示令牌无效或已过期:   **https://iamhost:8443/event/1**

最后需要考虑的因素  

本文演示了如何将IAM中的OAuth 2.0身份验证添加到IRIS中未经身份验证的服务中。需要牢记的是,IRIS中的服务本身仍是未经身份验证的。因此,如果有人绕过IAM层直接调用IRIS服务端点,则可以在不经过任何身份验证的情况下查看信息。出于该原因,在网络级别设置安全规则以防止不必要的请求绕过IAM层是很重要的。 

可以在此处了解更多有关IAM的信息。 

如果您想试用IAM,请联系InterSystems销售代表。