在微服务场景中,身份认证通常是集中处理,这也是有别于单体应用一把梭哈的模式,其中,在微软微服务白皮书中,提供了两种身份认证模式:

  • 网关,没错,原话是If you're using an API Gateway, the gateway is a good place to authenticate

img
  • STS(security token service)

Diagram showing authentication through backend microservices.

如果使用网关进行集中身份认证,微服务如果没有设置了额外的安全性来验证消息,就必须确保微服务在没有经过网关的时候,不能直接被访问。从图中也可看到,用户信息是由网关进行转发请求时增加的。

如果使用STS进行集中身份认证,是可以直接访问服务,需要使用安全令牌服务(STS)的专用身份验证单独的服务(微服务)对用户进行身份验证。由STS颁发token,然后在请求微服务时就需要在请求中携带token。

我们文章后续:主要就是围绕着STS安全令牌服务中间件IdentityServer4来具体展开的。

1.引言

1.1 实际遇到的问题

在之前一个单体web系统中,采用的是前后端分离,前端是Vue 2.0,后端使用的ASP.NET Web Api 2.0提供后台服务,登录模块采用了JWT(JSON WEB TOKEN)的身份认证方式,在用户请求时后台自定义解析JWT,然后把解析的部分结果装进HttpContext.Principal,供后续授权操作。那时会遇到一个问题,前端并没有mock开发,而是连接后端测试环境开发,前端在开发调试时,后端同步发布最新接口,再加上IIS老版本发布web服务,会有一个初次访问非常慢的问题,这时前端就会炸锅,“后端挂了?请求不到JWT”,这个过程其实挺影响开发效率的,那时就萌生了把身份认证和授权单独作为一个项目部署,由于本身属于项目基础设施,改动的频率几乎为0,业务层面也可以按需拆分,这可能就是我最早微服务思路的萌芽吧!

1.2 其他问题

微信公众号开发

做过微信公众号开发,我们大多数应用都希望用户通过微信进行操作,然后留存用户信息,我们需要经过如下步骤:

  • 向微信官方申请AppId,Appsecret,还有单独一个加密密钥

  • 然后请求https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6953deeefe22a83b&redirect_uri=your_address&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

    • 这里用户访问,需要用户授权

  • 然后微信浏览器会重定向至上一步的redirect_uri指定的网址,且还会在querystring加上code

    • 这个code,记住

  • 然后就可以通过code,https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code在后台获取access_token,openid

    • access_token是凭证

    • openid是微信的用户体系

  • 最后就能通过https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN,就能通过上一步中获取到的access_token,获取微信用户的信息

类似的还有华为开放平台鉴权

2.OAuth 2.0

无论是微信公众号,还是华为开发平台,他们为了构造自己的生态,运用自己庞大的用户基数,去为第三方提供服务(如果可以的话,顺便收钱),但是他们面临的问题:

  • 不能直接把用户的信息直接暴露,不然就是侵权行为

  • 更不可能把用户的用户名和密码直接暴露

怎么办?第三方应用程序需要知道当前操作的用户身份,就需要身份验证,这时OAuth协议应运而生,OAuth2.0引入了一个授权层,分离两种不同的角色:

  • 客户端

  • 资源所有者(用户)

只有用户同意以后,服务器才能向客户端颁发令牌,客户端通过令牌Token去请求数据,从某种意义上说OAuth2.0是一种委托协议,把原本可能需要用户名和密码才能拿到的数据,通过授权(Authorization)产生的access-token,并以此来进行相关访问。

简单说系统用户允许某个应用代表他们访问用户自己能够控制的资源。

OAuth 2.0包含如下主要内容:

2.1 授权方式

实际上,OAuth2.0有4种授权方式

  • 授权码-authorization-code

  • 隐藏式-implicit

  • 密码式-password

  • 客户端凭证-client credentials

不管哪一种授权方式,第三方应用申请令牌之前,都需要像微信公众号开发那样,必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会也不可能拿到令牌的。

2.2 端点

  • Authorization Endpoint ,授权端点

  • Token Endpoint ,Token端点

2.3 Scope

代表资源所有者在被保护的资源那里的一些权限,可以把被保护的资源分为不同的scope,这个粒度由开发者自定义,常见的有角色

2.4 Access Token

  • 用来访问被保护资源的凭据

  • 代表了给客户端颁发的授权,也就是委托给客户端的权限

    • OAuth2.0没有对Token的格式和内容定义,只有有一个要求:Access-token要描述出资源所有者授予权限的范围,也就是scope,以及Access-token的有效期

2.5 Refresh Token

  • 获取Access token的凭据

  • 由授权服务器颁发

  • 它是一个可选项

  • 具备让客户端应用逐渐降低访问权限的能力

    • 可以在Refresh Token请求重新获取Access Token时,做一个设计,根据实际需求,给一个权限越来越低的token

3.OpenId Connect 1.0

上一节说过,OAuth 2.0是一种授权机制,是一种委托协议,但是不是一个身份认证协议。OAuth2.0的Access Token不含有身份认证信息,也不是为客户端准备的,本身也不对客户端透明,Access Token真正的受众是被保护的资源。

当然我们不排除一些简单的系统鉴权要求,它只需限制对是否具有有效安全令牌的用户的访问,并不需求身份认证。

OAuth2.0设计的Access Token不含有身份认证信息,但是JWT具有自包含特点,其实我们是可以把Access-Token设计为即具有身份信息,又包含授权信息。在一些简单的单体应用中,把身份认证和授权揉在一起,根据Access_Token解析身份信息和然后再根据身份信息,配合设计的权限规则(db存储)过滤请求,的确可以这样做,事实上有一些开源项目,包括我自己,都这样干过。

在一些实际场景下,这种使用access-token作为身份认证的凭据是成立的,因为token是经过身份认证后,刚被创建的,再加上后续验证与数据存储的交互,可以确保无虞。

但是如果是在OAuth2.0中,这并不是获取access-token的唯一方法。Refresh Token和assertions可以在用户不存在的情况下获取access token。而在某些情况下,用户无需身份验证即可获得access token。另外用户不存在,access-token通常还会存在很长时间。记住重要的一点:OAuth是一个授权协议,保护的是资源,突出一个保护,那么必须保证用户是存在的;access-token受众是受保护的资源,客户端是授权的提出者,因此受保护的资源不能仅通过token的单独存在来判断用户是否存在,因为 OAuth 协议的性质和设计,在客户端和受保护资源之间的连接上,用户是不可用的。

当应用程序需要知道当前用户的身份时,就需要进行身份认证。通常,这些应用程序代表该用户管理数据,并需要确保该用户只能访问允许他访问的数据。

目前最常见的身份验证协议是SAML2p、WS-Federation和OpenID Connect——SAML2p是最流行和部署最广泛的。

OpenID Connect是三者中最新的一个,但是却被认为是未来的发展方向,因为它对现代应用程序具有最大的潜力。它从一开始就为移动应用场景而构建,并被设计为对API友好。

OpenID Connect

  • 是基于OAuth 2.0协议之上的简单身份层,是在OAuth2.0之上做的一个扩展,兼容OAuth2.0,身份验证和API访问这两个基本的安全问题被组合成一个协议——通常只有一次到**安全令牌服务(STS)**的往返,所以这里没有详细介绍OAuth2.0的授权流程的原因,因为OpenId Connect几乎包含了整个OAuth2.0

OAuth 2.0与OpenID Connect1.0 映射表

OAuth2.0 OpenID Connect 1.0
资源所有者 用户
客户端 依赖方
授权服务器+被保护资源 身份提供商

OpenId Connect 1.0包含如下主要内容:

3.1 ID Token

包含了用户的认证信息

3.2 UserInfo端点

获取用户信息

3.3 预设

一组标识身份的scopes和claims

  • profile

  • email

  • address

  • phone

3.4 OpenID Connect 流程

  • 授权码流程-Authorization Code Flow

  • 隐式流程-Implicit Flow

  • 混合流程-Hybrid Flow

4.OpenID Connect 与 OAuth 2.0

下一篇我们将正式开始介绍对OpenID Connect+OAuth2.0这两种协议的实现中间件:IdentityServer4,其经过高度优化,可以解决当今移动、本机和web应用程序等典型的安全问题。

在不同的文献对可能会同一角色使用不同的术语,所以IdentityServer又可称为安全令牌服务(STS)、身份提供者(IDP)、授权服务器(AuthServer)、IP-STS等等。它的主要职责也就是OAuth2.0与OpenID Connect职责的综合,

也是IdentityServer4的职责:

  • 保护资源

  • 使用本地用户存储或通过外部身份提供程序对用户进行身份认证

  • 提供session管理和单点登录

  • 管理和认证客户端

  • 向客户端颁发身份标识和访问令牌

  • 验证Token

我们来回顾一下两个协议的要点,

也是IdentityServer4的要点:

  • 必须先到系统备案

  • 授权端点

  • 获取Toekn端点

  • 获取用户信息端点

  • 刷新Token端点

  • ID token

  • 不同的权限scope

我们将在后续文章中一一对应职责与要点

参考链接

http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

https://www.cnblogs.com/linianhui/p/authentication-based-on-oauth2.html#auto-id-3

https://www.cnblogs.com/linianhui/p/oauth2-extensions-protocol-and-json-web-token.html#auto_id_2

https://www.cnblogs.com/linianhui/p/oauth2-authorization.html#auto_id_17

https://www.cnblogs.com/linianhui/p/oauth2-extensions-protocol-and-json-web-token.html#auto_id_2

https://www.cnblogs.com/linianhui/p/oauth2-extensions-protocol-and-json-web-token.html#auto-id-2

https://www.scottbrady91.com/OpenID-Connect/OpenID-Connect-Flows

https://identityserver4.readthedocs.io/en/latest/intro/big_picture.html

长按二维码关注

点外卖,先领券

【One by One系列】IdentityServer4(一)OAuth2.0与OpenID Connect 1.0相关推荐

  1. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  2. OpenID Connect 1.0 / 总览

    OpenID Connect 是什么 OpenID Connect 1.0 是一个建立在 OAuth 2.0 协议上的身分层 允许 Client 确认终端用户基于授权服务器鉴权的身份 还可以让 Cli ...

  3. PHP下的Oauth2.0尝试 - OpenID Connect

    OpenID Connect OpenID Connect简介 OpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议.它使用简单的REST / JSON消息流来实现,和之 ...

  4. jws webservice 跳过https认证_基于OAuth2的OIDC (OpenId Connect)身份认证

    OIDC协议 OIDC(OpenID Connect)是在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议. OAuth2协议 OAuth2是一个授权协议,它无法提供完善的 ...

  5. OAuth2.0(及OIDC 1.0)选型建议及SSO、SLO方案

    目录 1. 关于认证 2. OAuth 2.0 3. OIDC 1.0 4. OIDC选型建议 4.1 PKCE 5. SSO方案 5.1 SSO SPA 5.2 SSO WEB 6. SLO方案 6 ...

  6. OpenID Connect:OAuth 2.0协议之上的简单身份层

    OpenID Connect是什么?OpenID Connect(目前版本是1.0)是OAuth 2.0协议(可参考本人此篇:OAuth 2.0 / RCF6749 协议解读)之上的简单身份层,用 A ...

  7. IdentityServer4 使用OpenID Connect添加用户身份验证

    使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...

  8. 通过Keycloak API理解OAuth2与OpenID Connect

    文章目录 通过Keycloak API理解OAuth2与OpenID Connect 前言 OAuth2 介绍 OAuth2核心概念 OAuth2 核心数据 JWT OAuth2 flow Autho ...

  9. [OAuth2.0三方登录系列文章-1]OAuth2.0与三方登录的端到端方案

    系列文章 [OAuth2.0三方登录系列文章-1]OAuth2.0与三方登录的端到端方案 [OAuth2.0三方登录系列文章-2]如何设计基于OAuth2.0的授权登录SDK以及竞品分析 [OAuth ...

最新文章

  1. 验证码广告:站长增加收入新渠道
  2. [leetcode]102.二叉树的层序遍历
  3. LeetCode 之 JavaScript 解答第141题 —— 环形链表 I(Linked List Cycle I)
  4. lvds接口屏线安装图解_五分钟让你学会液晶拼接屏安装方法
  5. Nginx记录客户端POST过来的具体信息
  6. 单片机ADC采样算法----限幅平均滤波法
  7. 超级计算机 500,191台超算500强排名分布区间:前百强4台,前两百强31台
  8. mysql创建数据库sql语句
  9. matlab d函数,matlab常用函数大集合
  10. 图片计算景深matlab程序,在线景深计算器
  11. windows2016小文件服务器,Windows Server 2016 搭建 SMB 共享文件
  12. Vue中常用的开发小技巧-让开发更便捷快速-总结
  13. 计算机怎么查文件打印记录表,win10系统查看打印机打印历史记录的设置教程
  14. 宋叔日记--新手级别入门全能赚钱软件!
  15. 【12月英语——快乐中学习】
  16. matplotlib.pyplot.cm结构及用法||参数详解
  17. HCIA---day02
  18. Torch 论文复现:梯度加权类激活映射 Grad-CAM
  19. 一种基于 dlib 的脸部标记检测器
  20. u盘在本机电脑读不出来,但别的机器可以读解决方案

热门文章

  1. 安装SQLserver2008
  2. Python集合和函数
  3. Discuz X3.2源码解析 discuz_application类(转自百度)
  4. C#实现ByteBuffer类 .
  5. LuckyDraw bot有幸被提名为微软2019的People's Choice app
  6. 使用LiveClick升级您的实时书签
  7. powerpoint预览_如何放大和缩小PowerPoint演示文稿的一部分
  8. yii之behaviors
  9. vue实现首屏加载等待动画 避免首次加载白屏尴尬
  10. 上海纳税百强2016,邢台2017纳税百强,深圳百强企业