驯服信任协议-使用InterSystems IRIS进行OAuth身份验证

在保持安全性和隐私性的同时,如何允许计算机在您不在的情况下彼此信任?



-干马提尼酒。 在一个大杯子里。
-Oui,先生。 [是,先生(神父)]
“只是一秒钟,不是全部。” 戈登的三个手指,伏特加酒之一,基纳·莱克莱特的半指。 在振动筛中搅拌均匀,然后放入一大片柠檬。 你还记得吗

扬·弗莱明(Jan Fleming),皇家赌场,1953年

第1部分。OAuth2.0和OpenID Connect故事


通用,而且在21世纪的今天,每个人最喜欢的开放访问委派和身份验证协议捆绑称为OAuth + OIDC。 更适合大众使用,他们还没有提出任何建议。 它们在前端供应商中特别受欢迎,因为它们基于HTTP(S)协议并使用JWT( JSON Web令牌 )容器。 OpenID Connect使用OAuth进行工作,或者说OIDC是OAuth的包装器。

OpenID-身份验证和数字标识系统创建的开放标准对开发人员而言并不新鲜。 今年,他14岁。 在当前的第三个版本中,全名是OpenID Connect或短于OIDC。 它在Web和移动开发以及公司系统中都很流行。

他的合作伙伴OAuth开放式访问授权标准已经快12岁了。 距相应的RFC 5849标准出现已有9年了,我们将依靠OAuth 2.0协议的现代版本和当前的RFC 6749 。 请记住,OAuth 2.0与之前的OAuth 1.0不兼容。
OAuth是用于委派访问的开放协议(方案,传输),它允许向第三方提供对用户受保护资源的有限访问权限,而无需向其传输RFC 6749的登录名和密码(第三方)

oauth.net是Aaron Parecki托管的领先的OAuth网站

oauth.com -OAuth 教程和测试环境

开放式ID连接(OIDC)是用于分散式身份识别系统的开放标准,它允许用户使用第三方服务在各种不相关的Internet资源上创建一个用于识别的单一帐户,使用OAuth消息和JWT容器进行安全通信。
严格来说,OAuth不是协议,而是用于在软件系统中实现访问控制定界的体系结构时,用于将用户标识操作分离并传输到单独的受信任服务器的一组规则(方案)。

而且,请注意, OAuth不能对特定用户说任何话 ! 无论他是谁,现在不在哪里,也无论他现在是否在计算机上工作。 但是,这使得使用已经发布的访问令牌,无需用户干预即可与系统进行交互。 这是重要的一点。
它可能派上用场:


OAuth + OIDC + UMA的联合使用允许在不同主题领域中实施安全标识和访问控制(身份和访问管理-IdM,IAM)系统,例如:


API经济的访问控制新领域

最重要的是,请勿将个人数据与系统其余部分存储在同一位置。 单独的物理身份验证和授权。 甚至更好的是-将所有身份亲自提供给该人员,并且永远不要随身携带。 信任设备所有者。
苹果说俄罗斯人在俄罗斯存储什么个人数据。 这是姓名,地址,电子邮件,电话号码。 但是,消息,照片等人们自己信任iCloud云(不在俄罗斯)。

第2部分。短剧“信任与认证”


因此,我们决定将亲爱的用户的个人数据既不存储在我们的应用程序中,也不存储在与正常工作的数据库一起的单个存储中,是不容易的。 也就是说,他们选择了可靠的受托人来为我们提供这项服务。 因此,当用户Ma下出现时,我们提供以下对话。

演员:

  • 用户名
  • 客户申请
  • 身份服务
  • 资源服务器

该操作在用户计算机上的浏览器中进行。 所有角色早已彼此熟悉。 用户在身份服务上拥有一个个人帐户。 客户端应用程序与身份验证服务和相互接口之间签署了有效合同。 资源服务器在向任何他可以识别的患者颁发访问密钥的问题上信任身份服务。

用户(P):(通过启动基于Web的客户端应用程序)亲爱的客户端应用程序,我需要“此资源”。
客户端应用程序(K):尊敬的用户,首先提供“此资源”的密钥。 没有密钥,将关闭对“此资源”的访问。
警:我没有这样的钥匙。
克:然后,我暂时将您切换到身份识别服务,我们同意与该服务签发资源服务器的密钥。 (将P.重定向到识别服务)
身份验证服务(I):尊敬的用户,请告诉我您是谁以及需要什么密钥?
警:我,Ytsuken用户用户,密码如此,我想访问“此资源”。
并且:谢谢静研同志。 验证成功,并且您的身份已验证。 这是“此资源”的关键(P.重定向回K。)
警:客户,我为您带来了所需“资源”的钥匙。
克:谢谢您。 钥匙是正确的。 这是您要求的“资源”。

窗帘。 电影《 2001年太空漫游》 中的理查·施特劳斯的开幕交响曲

第3部分。真实授权服务


现在让我们开始做生意。 我们的议程中有三项任务:任命角色,准备舞台和进行表演。 一切都在InterSystems IRIS平台上立即确定。 但这不是必需的,您可以自行决定从不同平台组装设计。 例如,在以下组合中:OAuth Keycloak服务器+ IRIS上的OAuth客户端和OAuth资源。 换句话说:

  1. 在我们的演示客户端注册后,配置并启动OAuth服务器。
  2. 通过将演示OAuth客户端连接到OAuth服务器和Web资源来设置它。
  3. 开发可以使用OAuth的客户端应用程序。 您可以使用Java,Python,C#,NodeJS。 以下是ObjectScript中的示例应用程序代码。

开发人员社区的网站由Daniel Kutak分为三部分进行了详细说明,并举例说明了在IRIS中基于CSP将OAuth用于不同的应用程序( 第1 部分第2 部分第3部分 )。
OAuth中有很多设置。 因此,写下您自己的清单-这是最适合他们的应用程序。 下面的示例和空白。
从何处获取现成的InterSystems IRIS样品? 每个人至少有两个选择:

在“ InterSystems学习实验室”部分的“ InterSystems学习服务”培训平台上获取现成的预配置云IRIS服务器

安装一个现成的docker容器 。 在本文中阅读更多内容-针对使用Docker开发人员启动IRIS的初学者的分步说明,或者喜欢视频的分步说明,以及使用 InterSystems IRIS使用Docker和VSCode开发解决方案的截屏说明。

1-1配置OAuth服务器


我们进入IRIS管理门户并选择以下部分:

系统管理>>安全性>> OAuth 2.0 >>服务器

接下来,在每个段落中,将为设置行命名,并在必要时通过冒号表示示例或解释。



常规设置标签:
说明:可选,例如,“授权服务器”
生成器终结点(以下称为CTG)是主机名:服务器的DNS名称
支持的权限类型(至少选择一种):
授权码
隐含的
凭据:资源,所有者,密码
客户凭证
SSL / TLS配置:oauthserver

权限标签:
添加受支持的卷:例如scope1和scope2

间隔标签:
访问密钥间隔:3600
授权码间隔:60
更新密钥间隔:86400
会话中断间隔:86400
客户密钥有效期:0

JWT设置标签:
输入算法:RS512
密钥管理算法:RSA-OAEP
内容加密算法:A256CBC-HS512

自定义标签:
标识类:%OAuth2.Server.Authenticate
检查用户类别:%OAuth2.Server.Validate
会话服务类:OAuth2.Server.Session
生成密钥类:%OAuth2.Server.JWT
自定义命名空间:%SYS
自定义角色(至少选择一个):%DB_IRISSYS和%Manager

保存。

1-2在OAuth服务器上注册客户端




客户描述按钮>>创建客户描述按钮:

常规设置标签:
名称:客户
描述:任意
客户类型:机密
重定向URL:认证后我们应用程序中的返回点地址
支持的权限类型
授权码:是
隐含的
凭据:资源,所有者,密码
客户凭证
JWT授权
支持的答案类型
代号
id_token
id_token密钥
代币
授权类型:简单

客户端凭据选项卡:自动填充

客户信息标签:
启动网址:
登录画面
客户姓名
徽标网址
客户端主页URL
政策网址
服务网址条款

2-1在OAuth服务器客户端上配置绑定


系统管理>>安全性>> OAuth 2.0 >>客户端



创建服务器描述:
生成器端点:取自常规服务器参数,请参见上文
SSL / TLS配置:从预配置列表中选择

其余字段的内容将自动从服务器下载,但您也可以手动配置它们:

授权服务器
授权端点:CTG + /授权
关键端点:CTG + /令牌
用户信息端点:CTG + / userinfo
关键的自我诊断终点:CTG + /吊销
关键撤销端点:CTG + /内省
JSON Web令牌设置(JWT)
动态注册以外的其他来源:从URL中选择JWKS
网址:CTG + / jwks



例如,从该列表中可以看出(scopes_supported和Claims_supported),服务器可以为OAuth客户端提供有关用户的不同信息。 值得注意的是,在实施应用程序时,您需要询问用户准备共享哪些数据。 此外,在我们的示例中,scope1仅要求我们提供许可。

保存。

如果指示SSL的错误,请转到设置:
系统管理>>安全性>> SSL / TSL配置

2-2配置OAuth客户端


系统管理>>安全性>> OAuth 2.0 >>客户端>>客户端配置>>创建客户端配置



常规标签:
应用名称:演示客户端
客户名称:演示客户
说明:可选
启用:是
客户类型:机密
SSL / TCL配置:oauthclient
客户端重定向URL:服务器的DNS名称
所需的权限类型
授权码:是
隐含的
凭据:资源,所有者,密码
客户凭证
JWT授权
授权类型:简单

客户信息标签:
登录画面
徽标网址
客户端主页URL
政策网址
服务网址条款
默认音量:我们取自服务器先前指定的音量,例如scope1
联系人电子邮件地址(以逗号分隔)
最大默认年龄(以秒为单位)

JWT设置标签:
JSON Web令牌设置(JWT)
根据X509凭证创建JWT设置
IDToken算法
签名:RS256
加密:A256CBC
密钥:RSA-OAEP
Userinfo算法
访问令牌算法
查询算法

客户端凭据选项卡:
编号 客户端:来自在服务器上客户端注册后发出的客户端(请参见上文)
发出客户编号
客户端的秘密:从在服务器上注册客户端时发出的密码(请参见上文)
客户机密到期
客户注册URI

保存。

第4部分。代码


让我们使用OAuth授权和REST创建一个简约的Web应用程序。
在工作时,OAuth依赖于以下事实:交互中参与者(服务器,客户端,Web应用程序,用户浏览器,资源服务器)之间的通信通道受到某种方式的保护。 通常,此角色由SSL / TLS扮演。 但是OAuth也可以在不安全的渠道上使用。 例如,默认情况下,Keycloak服务器使用HTTP协议,并且没有保护。 这简化了开发过程中的开发和调试。 真正使用OAuth服务时,必须严格启用通道保护-这记录在Keycloak文档中。 InterSystems IRIS开发人员对OAuth采取了更为严格的方法-需要SSL / TSL。 唯一的简化是,您可以使用自签名证书或使用IRIS中内置的PKI服务(系统管理>>安全>>公钥系统)。
使用两个参数的明确指示来检查用户授权-在OAuth服务器和OAuth客户端中注册的应用程序的名称以及支持的卷(范围-我想知道如何用俄语正确命名吗?):

Parameter OAUTH2APPNAME = "OAuthClient"; set isAuthorized = ##class(%SYS.OAuth2.AccessToken).IsAuthorized( ..#OAUTH2APPNAME, .sessionId, "scope1", .accessToken, .idtoken, .responseProperties, .error) 

在没有授权的情况下,我们正在准备一个指向用户标识请求的链接,并获得他的许可以使用我们的应用程序。 在这里,我们不仅需要指示在OAuth服务器和OAuth客户端中注册的应用程序名称和请求的卷(范围),还需要指示Web应用程序应返回用户的反向链接。

 Parameter OAUTH2CLIENTREDIRECTURI = "https://52773b-76230063.labs.learning.intersystems.com/oauthclient/" set url = ##class(%SYS.OAuth2.Authorization).GetAuthorizationCodeEndpoint( ..#OAUTH2APPNAME, "scope1", ..#OAUTH2CLIENTREDIRECTURI, .properties, .isAuthorized, .sc) 

我们使用内置的IRIS身份验证服务,因此,我们在OAuth IRIS服务器上注册用户。 例如,仅向用户设置用户名和密码就足够了,您无需在帐户中进行其他设置。

当使用接收到的链接转移用户时,服务器将执行用户标识过程并请求其许可以使用Web应用程序中的凭据进行操作,并将结果保存在%SYS区域的全局OAuth2.Server.Session中:





3.演示授权用户的数据。 成功完成程序后,我们将获得例如访问令牌。 让我们得到它:

 set valid = ##class(%SYS.OAuth2.Validation).ValidateJWT( .#OAUTH2APPNAME, accessToken, "scope1", .aud, .JWTJsonObject, .securityParameters, .sc ) 

使用OAuth的示例的完整工作代码:
 Class OAuthClient.REST Extends %CSP.REST { Parameter OAUTH2APPNAME = "OAuthClient"; Parameter OAUTH2CLIENTREDIRECTURI = "https://52773b-76230063.labs.learning.intersystems.com/oauthclient/"; // to keep sessionId Parameter UseSession As Integer = 1; XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes> <Route Method="GET" Url = "/" Call = "Do" /> </Routes> } ClassMethod Do() As %Status { // Check for accessToken set isAuthorized = ##class(%SYS.OAuth2.AccessToken).IsAuthorized( ..#OAUTH2APPNAME, .sessionId, "scope1", .accessToken, .idtoken, .responseProperties, .error) // to show accessToken if isAuthorized { set valid = ##class(%SYS.OAuth2.Validation).ValidateJWT( ..#OAUTH2APPNAME, accessToken, "scope1", .aud, .JWTJsonObject, .securityParameters, .sc ) &html< Hello!<br> > w "You access token = ", JWTJsonObject.%ToJSON() &html< </html> > quit $$$OK } // perform the process of user and client identification and get accessToken set url = ##class(%SYS.OAuth2.Authorization).GetAuthorizationCodeEndpoint( ..#OAUTH2APPNAME, "scope1", ..#OAUTH2CLIENTREDIRECTURI, .properties, .isAuthorized, .sc) if $$$ISERR(sc) { w "error handling here" quit $$$OK } // url magic correction: change slashes in the query parameter to its code set urlBase = $PIECE(url, "?") set urlQuery = $PIECE(url, "?", 2) set urlQuery = $REPLACE(urlQuery, "/", "%2F") set url = urlBase _ "?" _ urlQuery &html< <html> <h1>  IRIS   OAuth2</h1> <a href = "#(url)#">  <b>IRIS</b></a> </html> > quit $$$OK } } 


如有必要,请在OAuth服务器和OAuth客户端上启用扩展调试消息。 将消息写入%SYS区域中的ISCLOG全局。 输入您的IRIS终端(或安装并使用Web终端 ):

 set ^%ISCLOG = 5 set ^%ISCLOG("Category", "OAuth2") = 5 set ^%ISCLOG("Category", "OAuth2Server") = 5 

有关更多信息,请参见使用OAuth 2.0和OpenID Connect的IRIS文档。

结论:

  1. OAuth通过用户凭据和“有效”数据库帮助在物理上和地理上分离服务。 从而加强身份数据的保护,并在必要时遵守有关保护不同国家个人数据的法律要求。
  2. 使用OAuth,您可以为用户提供在多个设备上安全地同时进行工作的能力,并将其个人数据“最小化”发光到各种服务和应用程序。 以及不获取有关其服务用户的“冗余”信息,即在其服务中进行非个性化数据处理。
  3. 使用InterSystems IRIS时,您具有一整套现成的工具,可以独立或与第三方软件产品一起测试和部署OAuth和OIDC服务。

哪些行业最常使用InterSystems IRIS平台?
用于医疗保健自动化,金融部门,电子政务项目,物流,零售和许多其他行业。

如果您对医疗保健自动化的任务感兴趣,请注意FHIR标准。 InterSystems IRIS for Health(InterSystems IRIS平台的特殊版本)支持用于集成和应用程序开发的FHIR标准
正如您在上面看到的,所有OAuth功能都可以轻松访问并完全可以使用。 如有必要,可以用自己的处理程序类和用户界面替换。 OAuth服务器和客户端设置可以从配置文件进行,而无需使用管理门户。

Source: https://habr.com/ru/post/zh-CN466699/


All Articles