开源项目微服务架构与应用Spring 学习

基于OAuth2.0的统一身份认证中心设计

2018-06-26  本文已影响73人  子文001

1. 引言

公司经历多年发展后,在内部存在多套信息系统,每套信息系统的作用各不相同,每套系统也都拥有自己独立的账号密码权限体系,这时,每个人员都需要记住不同系统的账号密码,人员入职和离职时,人事部门都需要对多个系统进行账号的分配和关停,更严重的是部分系统的管理权限不在人事部门,人员离职时系统的账号未能及时关停,存在较大的安全风险。
为此,公司计划建立一个统一的身份认证中心来统一管理账号密码,由认证中心来统一发放和回收账号,其他业务系统通过简单改造以实现与认证中心进行集成。比较了SAML2.0和OAuth2.0两种协议方案,最终选择了相对简单的OAuth2.0。

2. OAuth2.0

OAuth 2.0官方的介绍是:

OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 supersedes the work done on the original OAuth protocol created in 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices. This specification and its extensions are being developed within the IETF OAuth Working Group.

OAuth 2.0是用于授权的行业标准协议。OAuth 2.0取代了在2006年创建的原始OAuth协议上所做的工作。OAuth 2.0专注于客户端开发人员的简单性,同时为Web应用程序,桌面应用程序,手机和客厅设备提供特定的授权流程。

在目前的系统中,各系统用户需要访问系统内的资源时,一般需要凭用户名和密码登录系统后才能访问,这时各系统自己存储和管理用户的用户名和密码,就会出现文章之初出现的问题(实际问题可能会有其他情况),而使用OAuth,用户的账号密码存储在身份认证中心,可以有效避免此类问题的产生。

关于OAuth2.0框架的描述可参见以下链接:
OAuth 2.0 Framework - RFC 6749
OAuth 2.0授权框架

2.1 角色

OAuth定义了四种角色:

授权服务器和资源服务器之间的交互超出了本规范的范围。授权服务器可以和资源服务器是同一台服务器,也可以是分离的个体。一个授权服务器可以颁发被多个资源服务器接受的访问令牌

2.2. 协议流程

图1:抽象的协议流程

图1中所示的抽象的OAuth 2.0流程描述了四种角色之间的交互,包括以下步骤:

客户端从资源所有者获得授权许可(步骤(A)和(B)所示)的更好方法是使用授权服务器作为中介。

2.3 授权许可

授权许可是一个代表资源所有者授权(访问受保护资源)的凭据,客户端用它来获取访问令牌。本规范定义了四种许可类型——授权码、隐式许可、资源所有者密码凭据和客户端凭据——以及用于定义其他类型的可扩展性机制。
本次我们采用的是常用的授权码授权方式。

3. 授权码模式

参考:
What is the OAuth 2.0 Authorization Code Grant Type?
授权码许可

3.1 授权码模式流程

授权码模式流程

在图中所示的流程包括以下步骤:

3.2 授权请求

客户端通过按(../AppendixB/b.md)使用“application/x-www-form-urlencoded”格式向授权端点URI的查询部分添加下列参数构造请求URI:

客户端使用HTTP重定向响应向构造的URI定向资源所有者,或者通过经由用户代理至该URI的其他可用方法。
例如,客户端使用TLS定向用户代理发起下述HTTP请求(额外的换行仅用于显示目的):

GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
 Host: server.example.com

授权服务器验证该请求,确保所有需要的参数已提交且有效。如果请求是有效的,授权服务器对资源所有者进行身份验证并获得授权决定(通过询问资源所有者或通过经由其他方式确定批准)。

当确定决定后,授权服务器使用HTTP重定向响应向提供的客户端重定向URI定向用户代理,或者通过经由用户代理至该URI的其他可行方法。

3.3 授权响应

如果资源所有者许可访问请求,授权服务器颁发授权码,通过使用“application/x-www-form-urlencoded”格式向重定向URI的查询部分添加下列参数传递授权码至客户端:

例如,授权服务器通过发送以下HTTP响应重定向用户代理:

    HTTP/1.1 302 Found
    Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

客户端必须忽略无法识别的响应参数。本规范未定义授权码字符串大小。客户端应该避免假设代码值的长度。授权服务器应记录其发放的任何值的大小。

响应错误

3.4 访问令牌请求

客户端通过使用按“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起请求:

如果客户端类型是机密的或客户端被颁发了客户端凭据(或选定的其他身份验证要求),客户端必须如
必需的,如果客户端没有与授权服务器进行身份验证。

例如,客户端使用TLS发起如下的HTTP请求(额外的换行符仅用于显示目的):

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

授权服务器必须:

3.5 访问令牌响应

如果访问令牌请求是有效的且被授权,授权服务器如5.1节所述颁发访问令牌以及可选的刷新令牌。如果请求客户端身份验证失败或无效,授权服务器如5.2节所述的返回错误响应。

一个样例成功响应:

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"example",
  "expires_in":3600,
  "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
  "example_parameter":"example_value"
}
上一篇 下一篇

猜你喜欢

热点阅读