消除对安全服务的调用的另一种方法是使用包含有关用户信息的透明令牌. 透明令牌的流行标准是JSON Web令牌(JWT). JWT是在两个访问方之间安全地传输信息(例如用户身份和角色)的标准方法. JWT的内容包含一个JSON对象,该对象包含用户的信息(例如其身份和角色)以及其他元数据(例如到期日期). 它使用仅JWT的创建者已知的数字签名,例如API网关和JWT的接收者(服务). 此签名可确保恶意第三方无法伪造或篡改JWT.
由于不再需要访问安全服务进行验证,因此JWT的问题是令牌是独立的,这意味着令牌是不可撤销的. 按照设计,服务将在验证JWT的签名和到期日期后执行请求的操作. 因此,没有可行的方法来撤销掉落在恶意第三方手中的JWT令牌. 解决方案是发布具有较短到期时间的JWT,这可能会限制恶意方. 但是,短期JWT的缺点是应用程序必须以某种方式不断重新发布JWT,以保持会话处于活动状态. 幸运的是,这是OAuth 2.0安全标准旨在解决的众多问题之一. 让我们看看它是如何工作的.
假设您要为FTGO应用程序实现UserService,该应用程序管理包含用户信息(例如凭据和角色)的. API网关调用用户服务以验证客户端请求并获取JWT. 您可以设计UserService API并使用您喜欢的Web框架来实现它. 但这不是FTGO应用程序独有的通用功能,因此自己开发此类服务通常不值得.
幸运的是,您不需要开发这种安全性基础架构. 您可以使用标准的现成服务或称为OAuth 2.0的框架. OAuth 2.0是一种访问授权协议,其最初旨在使公共云服务(例如GitHub或Google)的用户能够向第三方应用程序授予对其信息的访问权限微服务之间调用安全,而不必向第三方应用程序公开其密码. 例如,OAuth 2.0使您能够安全地授予第三方基于云的持续集成(CI)服务并访问您的GitHub存储库.
尽管OAuth 2.0的最初重点是授权对公共云服务的访问,但是您也可以将其用于应用程序中的身份验证和访问授权. 让我们快速看一下微服务架构如何使用OAuth 2.0.
OAuth 2.0中的关键概念如下:
■授权服务器: 提供用于验证用户身份以及获取访问令牌和刷新令牌的API. SpringOAuth是用于构建OAuth 2.0授权服务器的良好框架.
■访问令牌: 授予访问资源服务器访问权限的令牌. 访问令牌的格式取决于特定的实现技术. Spring OAuth的实现中使用JWT格式的访问令牌.
■刷新令牌: 客户端用于长期获取新的AccessToken,但也可以被吊销令牌.
■资源服务器: 一种使用访问令牌来授权访问的服务. 在微服务架构中,服务是资源服务器.
■客户端: 想要访问资源服务器的客户端. 在微服务架构中,API网关是OAuth2.0客户端.

首先,让我们讨论如何对API客户端进行身份验证,然后介绍如何支持基于登录的客户端.
图4显示了APIGateway如何验证来自API客户端的请求. APIGateway通过向OAuth 2.0授权服务器发送请求来验证API客户端,该服务器返回访问令牌. 然后,API网关将一个或多个包含访问令牌的请求发送到该服务.
图4 API网关通过向OAuth 2.0身份验证服务器发出请求来对API客户端进行身份验证. 身份验证服务器返回访问令牌,API网关将该访问令牌传递给服务. 该服务验证令牌的签名并提取有关用户的信息,包括其身份和角色
图4中所示的事件顺序如下:
1. 客户端发出请求,并使用基本身份验证来提供其凭据.
2. API网关将OAuth2.0密码授予请求()发送到OAuth 2.0身份验证服务器.
3. 身份验证服务器验证API客户端的凭据,并返回访问令牌和刷新令牌.
4. API网关在其服务请求中包含访问令牌. 该服务会验证访问令牌并使用它来授权请求.
基于OAuth 2.0的API网关可以使用OAuth 2.0访问令牌作为会话令牌来验证面向会话的客户端. 此外,当访问令牌过期时,它可以使用刷新令牌来获取新的访问令牌. 图5显示了API Gateway如何使用OAuth 2.0处理面向会话的客户端. API客户端通过将其凭据(发布POST)发送到API网关的/登录端点来启动会话. APIGateway将访问令牌和刷新令牌返回给客户端. 然后,API客户端在向API网关发出请求时会提供这两个令牌.
图5客户端通过将其凭据发送到API网关来登录. API Gateway使用OAuth 2.0身份验证服务器对凭据进行身份验证,并以cookie的形式返回访问令牌和刷新令牌. 客户端在向APIGateway的请求中包含这些令牌
事件的顺序如下:
1. 基于登录的客户端将其凭据发送到API网关.
2. APIGateway的LoginHandler将密码授予请求发送到OAuth 2.0身份验证服务器().
3. 验证服务器验证客户端的凭据,并返回访问令牌和刷新令牌.
4. APIGateway通常以cookie的形式将访问令牌和刷新令牌返回给客户端.
5. 客户端在对API网关的请求中包括访问令牌和刷新令牌.
6. APIGateway的会话AuthenticationInterceptor会验证访问令牌并将其包含在对服务的请求中.
如果访问令牌已过期或即将过期,API网关将通过发出OAuth 2.0刷新授权请求()获得新的访问令牌,并将刷新授权请求发送到包含刷新的授权服务器令牌. 如果刷新令牌尚未过期或尚未吊销,则授权服务器将返回一个新的访问令牌. API网关将新的访问令牌传递给服务,然后将其返回给客户端.
使用OAuth 2.0的一个重要好处是它是一种经过验证的安全标准. 使用现成的OAuth 2.0身份验证服务器,您无需浪费时间重新设计轮子或冒着开发不安全设计的风险. 但是OAuth 2.0并不是在微服务架构中实现安全性的唯一方法. 无论使用哪种方法,三个关键思想如下:
■API Gateway负责验证客户端的身份.
■API网关和服务使用透明令牌(例如JWT)来传递有关主题的信息.
■服务使用令牌获取主题的身份和角色.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-171247-2.html
还是蒋委员长说的对
可口可乐