客户端授权类型
为了获取访问令牌,客户端必须获取到资源所有者的授权许可。OAuth2默认定了四种授权类型,当然也提供了用于定义额外的授权类型的扩展机制。默认的四种授权类型为:
- authorization code 授权码类型
- implicit 简化类型(也称为隐式类型)
- resource owner password credentials 密码类型
- client credential 客户端类型
下面对常用的授权码类型和密码类型进行详细的介绍。
授权码类型
授权码类型(authorization code)通过重定向的方式让资源所有者直接与授权服务器进行交互来进行授权,避免了资源所有者信息泄漏给客户端,是功能最完整、流程最严密的授权类型,但是需要客户端必须能与资源所有者的代理(通常是Web浏览器)进行交互,和可从授权服务器中接受请求(重定向给予授权码),授权流程如下:
+----------+
| Resource |
| Owner |
| |
+----------+
^
|
(2)
+----|-----+ Client Identifier +---------------+
| -+----(1)-- & Redirection URI ---->| |
| User- | | Authorization |
| Agent -+----(2)-- User authenticates --->| Server |
| | | |
| -+----(3)-- Authorization Code ---<| |
+-|----|---+ +---------------+
| | ^ v
(1) (3) | |
| | | |
^ v | |
+---------+ | |
| |>---(4)-- Authorization Code ---------' |
| Client | & Redirection URI |
| | |
| |<---(5)----- Access Token -------------------'
+---------+ (w/ Optional Refresh Token)
- 客户端引导资源所有者的用户代理到授权服务器的endpoint,一般通过重定向的方式。客户端提交的信息应包含客户端标识(client identifier)、请求范围(requested scope)、本地状态(local state)和用于返回授权码的重定向地址(redirection URI);
- 授权服务器认证资源所有者(通过用户代理),并确认资源所有者允许还是拒绝客户端的访问请求;
- 如果资源所有者授予客户端访问权限,授权服务器通过重定向用户代理的方式回调客户端提供的重定向地址,并在重定向地址中添加授权码和客户端先前提供的任何本地状态;
- 客户端携带上一步获得的授权码向授权服务器请求访问令牌。在这一步中授权码和客户端都要被授权服务器进行认证。客户端需要提交用于获取授权码的重定向地址;
- 授权服务器对客户端进行身份验证,和认证授权码,确保接收到的重定向地址与第三步中用于的获取授权码的重定向地址相匹配。如果有效,返回访问令牌,以及可能返回的刷新令牌(Refresh Token)。
密码类型
密码类型(resource owner password credentials)需要资源所有者将密码凭证交予客户端,客户端通过自己持有的信息直接向授权服务器获取授权。在这种情况下,需要资源所有者对客户端高度可信任,同时客户端不允许保存密码凭证。这种授权类型适用于能够获取资源所有者的凭证(credentials)(如用户名和密码)的客户端。授权流程如下:
+----------+
| Resource |
| Owner |
| |
+----------+
v
| Resource Owner
(1) Password Credentials
|
v
+---------+ +---------------+
| |>--(2)---- Resource Owner ------->| |
| | Password Credentials | Authorization |
| Client | | Server |
| |<--(3)---- Access Token ---------<| |
| | (w/ Optional Refresh Token) | |
+---------+ +---------------+
- 资源所有者向客户端提供其用户名和密码等凭证;
- 客户端携带资源所有者的凭证(用户名和密码),向授权服务器请求访问令牌;
- 授权服务器认证客户端并且验证资源所有者的凭证,如果有效,返回访问令牌,以及可能返回的刷新令牌(Refresh Token)。
令牌刷新
客户端从授权服务器中获取的访问令牌(access token)一般是具备失效性的,在访问令牌过期的情况下,持有有效用户凭证的客户端可以再次向授权服务器请求访问令牌,但是如果不持有用户凭证的客户端可以通过和上次访问令牌一同返回的刷新令牌(refresh token)向授权服务器获取新的访问令牌。
小结
Spring Cloud Security。对于一个服务系统,安全是必须需要考虑的方面。应用安全是一个不断追求更强的目标,全面性、全系统的方法很重要,因为开发者永远不知道入侵者是如何对系统进行攻击。在系统安全的实现上,一般倡导使用安全层layers of security
,即多层次安全保证,通过连续层提供额外的安全性。每一层的安全性越强,应用程序的健壮性和安全性就越高。Java EE应用程序位于安全层的高层次,需要为它添加特定的问题域安全配置。