云原生社区 > 微服务 > 正文

微服务系列之授权认证(一) OAuth 2.0 和 OpenID Connect

简介: 这些年围绕着授权鉴权(authorization)和身份验证(authentication)诞生了很多规范和协议。这里只讨论最主流的最新的规范和协议:OAuth2.0、OpenID Connect、JWT。8
+关注继续查看

1.传统架构的授权认证

  传统应用架构,用户使用账号密码登录后,可以使用前端cookie存储登录状态,也可以使用后端session方式存储登录状态,小应用这么做其实很高效实用,当应用需要横向扩展时,就需要共享登录状态,这时候session的基于asp.net state这种当前服务器进程方式存储就失效了,需要换成sqlserver或者redis作为session共享存储,这些都不是问题,这些前提都是单体应用架构的方案,但是在微服务架构里,服务拆分零散且前后端分离,后端以API方式提供服务的前提下,这种认证授权方式用不了拉,这时候就需要一个安全的、跨分布式的、高性能的认证授权方案来解决。 

  这些年围绕着授权鉴权(authorization)和身份验证(authentication)诞生了很多规范和协议。这里只讨论最主流的最新的规范和协议:OAuth2.0、OpenID Connect、JWT。8

2.OAuth 2.0

  OAuth 2.0是关于授权鉴权的,一句话解释“OAuth?2.0是一种框架,其中服务的用户可以允许第三方应用程序访问他/她在服务中托管的数据,而无需向应用程序透露他/她的凭据”。

  说一下Oauth2.0相关的名词:

  • Resource Owner:资源所有者,就是某个应用的用户;
  • Client:客户端,一个想要用这个资源用户的名义去做一些事情的应用”;
  • Authorization Server:授权服务,前提是用户信任这个服务并且该服务拥有用户信息,用于颁发令牌给应用;
  • Resource Server: 一个应用(API或者服务);
  • Redirect URI: 一个网址URL,当Resource Owner在Authorization Server上授权了Client后,Authorization Server将会把Resource Owner重定向到的地方,也称“Callback URL”;
  • Authorization Code: 用户授权给client后通过RedirectUrl回调回去携带的code,用于client通过客户端模式向授权服务换取token;
  • Access Token: Client和Resource Server交互所使用的令牌,携带的访问权限范围,是你授权时通过勾选给client的,然后client拿着这个用户名义的token就可以访问你的资源了; 一般使用的是JWT格式;
  • Response Type: Client希望从Authorization Server收到的信息的类型,最常见的Response Type是code,也就是Client希望收到一个Authorization Code,也有Implicit隐藏式,password密码模式,Client Credential客户端凭证模式。  

  下面说一下几种常用授权类型的实际交互是怎么样的

(1) 授权码模式Authorization Code

image

(2)Implicit隐藏式

  这种模式,跳过获取code的步骤,在客户端重定向到授权服务时,讲responseType换成token。

(3)password密码模式

  这种是啥呢,需要用户非常非常信任client的时候,才使用这种模式,需要用户在clinet上输入账号密码,client拿着用户的账号密码去授权服务获取access token。

(4)Client Credential客户端凭证模式

  这是client与client之间的通信,与用户没啥关系,这种用于,流程是,A客户端使用clientId和secret通过授权服务,获取访问B客户端的token。我们实战中,是业务系统,在中台认证中心里获取一个长期的可以访问中台某些服务的token,业务服务直接通信中台服务,于用户无关。

3.OpenID Connect

  OpenID Connect实际上就是对于client来说,在OAuth 2协议上完善了身份认证的东西,并不是说Oauth 2.0没有提供认证能力,只是对于client来说,没有知道用户的认证过程,没有拿到用户认证信息而已,OIDC就是让OAuth把认证结果也告诉client,让client也知道了用户是认证过的。这样在授权码过程中如下图:

HTTP/1.1 302 Found
  Location: https://server.example.com/authorize?
    response_type=code
    &scope=openid%20profile%20email
    &client_id=s6BhdRkqt3
    &state=af0dasd
    &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb

在scope中增加了openid

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{
"access_token": "dasdqwdqd",
"token_type": "Bearer",
"refresh_token": "casdqwfw",
"expires_in": 3600,
"id_token": "dsadwqdqdqwdqV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5
NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ
fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz
AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q
Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ
NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd
QyHE5lcMiKPXfEIQILVq0pcgqeqgeqwhethrDSAdqwwqrt43t3"
}


  在返回的时候增加了id_token。

  那么问题来了,OAouth2.0 给客户端办法的access token中的Payload中是可以自定义的,并且也可以防篡改,直接把认证的身份信息自定义里多好啊。?或者说,通过access_token去oidc提供的一个endpoint(get/userinfo)去请求用户信息?

  原因以下几点:

  1)payload里可是明文传输的,增加了传输带宽,也增加了用户信息泄露的风险;

  2)access_token本身定义就是授权访问令牌,不关心用户信息,只关心是否能访问,功能耦合;

  3)通过endpoint请求用户信息,增加了不少额外的API开销。

下一节,我们会大至说一下.net core服务中基于OAuth2.0和OpenId Connect实现的框架 identiy server 4


版权声明:本文内容由便宜云服务器实名注册用户自发贡献,版权归原作者所有,便宜云服务器开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《便宜云服务器开发者社区用户服务协议》和《便宜云服务器开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringCloud Gateway网关为认证中心和用户微服务构建统一的认证授权入口
SpringCloud Gateway网关为认证中心和用户微服务构建统一的认证授权入口
77 0
实战!微服务 认证中心 如何扩展授权模式 实现多种方式登录?
实战!微服务 认证中心 如何扩展授权模式 实现多种方式登录?
24 0
【权限设计系列】「认证授权专题」微服务中的JWT协议以及全方面概念介绍指南
【权限设计系列】「认证授权专题」微服务中的JWT协议以及全方面概念介绍指南
41 0
【权限设计系列】「认证授权专题」微服务架构的登陆认证问题
【权限设计系列】「认证授权专题」微服务架构的登陆认证问题
266 0
微服务系列之授权认证(三) JWT
官方定义:JWT是JSON Web Token的缩写,JSON Web Token是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,可以将各方之间的信息作为JSON对象安全地传输。该信息可以被验证和信任,因为它是经过加密的。
177 0
微服务系列之授权认证(二) identity server 4
IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证授权框架。
131 0
SpringCloud微服务实战——搭建企业级开发框架(二十三):Gateway+OAuth2+JWT实现微服务统一认证授权
OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发token(令牌),使得第三方应用可以使用该token(令牌)在限定时间、限定范围访问指定资源。 ??OAuth2中使用token验证用户登录合法性,但token最大的问题是不携带用户信息,资源服务器无法在本地进行验证,每次对于资源的访问,资源服务器都需要向认证服务器发起请求,一是验证token的有效性,二是获取token对应的用户信息。如果有大量的此类请求,无疑处理效率是很低,且认证服务器会变成一个中心节点
801 0
(十) Spring Cloud构建分布式微服务架构 - SSO单点登录之OAuth2.0登录认证(1)
一、oauth中的角色 client:调用资源服务器API的应用 Oauth 2.0 Provider:包括Authorization Server和Resource Server (1)Authorization Server:认证服务器,进行认证和授权 (2)Resource...
9755 0
【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置
【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置 介绍 系列目录:【NET CORE微服务一条龙应用】开始篇与目录 在微服务的应用中,统一的认证授权是必不可少的组件,本文将介绍微服务中网关和子服务如何使用统一的权限认证 主要介绍内容为: 1、子服务如何实现和网关相同的鉴权方式 2.
2699 0
微服务
+关注
为微服务建设降本增效,为微服务落地保驾护航。
热门文章
热门讨论
+关注
愿天堂没有BUG(公众号同名)
面试真题·进阶教程·职场干货·思维导图免费分享
文章
问答
视频
相关电子书
更多
微服务在小米消息推送的实践和感悟
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载


http://www.vxiaotou.com