当我们在登录一些网站的时候,需要第三方的登录。比如,现在我们要登录简书https://www.jianshu.com/sign_in,我们使用微博登录,点击下方的一个微博的小按钮,就会出现这么一个地址https://api.weibo.com/oauth2/authorize?client_id=1881139527&redirect_uri=http%3A%2F%2Fwww.jianshu.com%2Fusers%2Fauth%2Fweibo%2Fcallback&response_type=code&state=%257B%257D。乍一看,这是什么玩意啊。我们来分解下:

https://api.weibo.com/oauth2/authorize?
client_id=&
redirect_uri=http%3A%2F%2Fwww.jianshu.com%2Fusers%2Fauth%2Fweibo%2Fcallback&
response_type=code&
state=%257B%257D

现在就要引出今天的主角了,OAuth2

那什么是OAuth2呢?

https://oauth.net/2/这是官网

https://open.weibo.com/wiki/授权机制,这是微博的授权机制

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html,这是阮一峰写的一篇对于OAuth2的介绍。

OAuth2.0是一个委托协议,它可用让那些控制资源的人允许某个应用代表这些人,而不是假冒和模仿这喜人,这个应用从资源的所有者哪里得到授权(Authentication)和Access Token,随后就可以使用这个Access Token来访问资源。(这里提到的假冒和模仿就是指在客户端复制一份用户名和密码,从而获取响应的权限)。是关于授权(Authentication)的,客户端应用可以请求Access Token,使用Tooken就可以访问API资源了。在上述的例子中,是微博给简书授权。

让客户端应用可以代表资源所有者(通常是用户)来访问被保护的资源,如下图:

资源所有者(Resource Owner),他拥有访问API资源的权限,并且他还可以委派权限(delegate)给其他应用来访问API。资源所有者通常是可以使用浏览器的人。

被保护的资源(Protected Resource)就是资源所有者拥有权限去访问的组件,它可以是很多种形式的,但是WebApi的形式还是最常见的。

客户端(Client)应用就是代表资源所有者访问被保护资源的一个软件,注意它既不是浏览器,也不是给你钱让你开发软件的人,在OAuth2里面,它是指被保护的API资源的消费者。

授权服务器(AS)是被受保护的资源所信任的,它可以发行具有特定目的的安全凭据给客户端应用,这个凭据就叫做OAuth的Access Token。

授权,如下图

 授权种类:

  1、Authentication Code

  2、Implicit

  3、Resource Owner Password Credentials,直接使用密码凭据(用户名和密码)作为授权来获得Access Token,只有当资源所有者和客户端之间高度新人的时候并且其它授权方式不可用的时候才可以使用这种授权方式。

  4、Client Credentials,有时候,资源或者叫资源服务器,并不属于某个最终用户,也就是没有资源所有者对该资源负责,但是客户端应用肯定还是要访问这些资源,这时候就只能使用Client Credentials这种授权方式了。

其他重要角色和组件:

  1、资源所有者Resource Owner  

  2、客户端Client

  3、被保护资源 Protected Resource

  4、授权服务器Authentication Server

  5、Access Token,它是用来访问被保护资源的凭据,授权服务器只是方形Token,被保护资源验证Token,客户端队友Access Token应该是完全健忘的。

  6、Scopes,被保护资源那里的一套权限,具有叠加性

  7、Refresh Token,用来获得Access Token的凭据,客户端是用Refresh Token来请求信的Access Token

通过refresh token来取得新的access token的流程

 重要端点:

  1、授权端点(Authentication Endpoint)是用来和资源所有者交互的,资源所有者在这里进行登录(身份认证),然后通过该端点可以对客户端进行授权(Authentication Grant)。授权服务器首先要验证资源所有者的身份,但是验证的方式并不在OAuth2的协议范围内。

  2、Token端点(Token Endpoint),客户端通过向Token端点展示它的授权(Authorization Grant)或Refresh Token来获取Access Token。除了Implicit之外所有的授权类型都需要使用该端点,因为Implicit和Access Token是直接发行的。

OpenId Connect(OIDC)

身份认证和授权。OAuth2不是身份认证(Authorization)协议,OpenId Connect可以进行身份认证(Authorization)。

一个比喻,授权,就好比生牛奶(多用途原料);身份认证,就好比奶茶(一个最终产品),以牛奶为主原料。OAuth2,是生牛奶,众多web安全架构的一种多用途的基本成分。OIDC,好比奶茶,基于OAuth2的身份认证协议,添加了一些组件来提供身份认证的能力。

更高级的协议,扩展并代替了OAuth2。OpenID Connect是建立在OAuth2协议上的一个简单的身份标识层,所以OpenID Connect兼容OAuth2。使用OpenID Connect,客户端应用可以请求Identity Token,它会和Access Token一同返回给客户端应用。这个Identity Token就可以被用来登录客户端应用程序,而客户端应用还可以使用Access Token来访问API资源。UserInfo端点,(OAuth2定义了Authorization端点和Token端点)它允许客户端应用和获取用户的额外信息。定义了不同类型的应用如何从身份识别提供商(IDP)安全的获取到这些Token。

与OAuth 2.0之间的角色映射关系

  1、身份供应商(Identity Provider,IdP)

  2、依赖方(Relying Party,RP,可以理解Wie客户端)

  3、OAuth2里面可以分为两部分

    a、资源所有者/客户端应用

    b、授权服务器/被保护资源

  4、身份认证协议里也是两大不分

    a、依赖方

    b、身份提供商

  5、映射OAuth2------OIDC

   授权服务器/被保护资源------身份提供商进行映射

   资源所有者--------最终用户

   客户端应用-----依赖方(RP)

Auth 2.0 与 OIDC 角色映射

 抽象流程:

依赖方(RP)发送请求到OpenID提供商(OP,也就是身份提供商)。

OpenID提供商验证最终用户的身份,并获得了用户委派的授权

OpenID提供商返回响应,里面呆着ID Token,也通常带着Access Token

依赖方现在可以使用Access Token发送请求到用户信息的端点

用户信息端点返回用户的声明(claims,相当于是用户的信息)。

OpenId Connect身份认证流程

Authorization Code Flow: 

  在Authorization Code流程里,一个授权码(Authorization Code)会被返回给客户端,这个授权码可以被直接用来交换ID Token和Access Token。该流程也可以在客户端使用授权码兑换Access Token之前对其身份认证。但是该流程要求客户端的身份认证动作在后台使用Client 和Secret来获得Tokens,这样就不会把Tokens暴露给浏览器或者其他访问浏览器的恶意应用了。

  要求客户端应用可以安全的在它和授权服务器之间维护客户端的Secret,也就是说只适合这样的客户端应用。它还适合于长时间的访问(通过Refresh Token)。授权码来自于授权端点,而所有的Tokens都来自于Token端点。

  Authorization Code流程的步骤如下:

    客户端准备身份认证请求,请求里包含所需要的参数

    客户端发送请求到授权服务器

    授权服务器对最红用户进行身份认证

    授权服务得最终用户的统一/授权

    授权服务器把最终用户发送回客户端,同时带着授权码

    客户端使用授权码向Token端点请求一个响应

    客户端接收到响应,响应的Body里面包含在和ID Token和Access Token

    客户端验证ID Token,并获得用户的一些身份信息

Implicit Flow:

  Implicit在请求Token的时候不需要明确的客户端身份认证,它使用重定向URI的方式来验证客户端的身份,因为这一点,Refresh Token也就无法使用了,这同样也不适合于长时间有效的Access Token。

  所有的Tokens都来自于授权端点,而Token端点并没有用到。

  该流程主要用于浏览器内的应用,Access Token和ID To恩一同被直接返回给客户端,因为这个原因,这些Tokens也会暴露于最终用户和跨域访问该浏览器的其他应用了。它并不适合于长时间的访问。

  Implicit流程的步骤如下:

    客户端准备身份认证请求,请求里包含所需要的参数

    客户端发送请求到授权服务器

    授权服务器对最终用户进行身份认证

    授权服务器获得最终用户的同意/授权

    授权服务器把最终用户发送客户端,同事带着ID Token,如果也请求了Access Token的话,那么Access Token也会一同返回。

    客户端验证ID Token,并获得用户的一些身份信息。

Hybrid Flow:

  Hybrid Flow是前两者的混合,在该流程里。有一些Tokens和授权码来自于授权重点,而另外一些Tokens则来自于Token端点。该流程允许客户端立即使用ID Token,并且只需要一次往返即可获得授权码。这种流程也要求客户端应用可以安全的维护Secret,它也适合于长时间的访问。

  Hybrid Flow的步骤如下:

    客户端准备身份认证请求,请求里包含所需要的参数

    客户端发送请求到授权服务器

    授权服务器对最终用户进行身份认证

    授权服务器获得最终用户的统一/授权

    授权服务器把最终用户发送回客户端,同事带着授权码,根据响应类型的不同,也考嫩恶搞带着一个躲着多个其他的参数

    客户端使用授权码向Token端点请求一个响应

    客户端接收到响应,响应的body里面包含着ID Token和Access Token

    客户端验证ID Token,并获得用户的一些身份信息。

三种流程特点的比较

 返回值类型的比较

 三种类型,根据response_type的不同,分为:

  response_type=code id_token、response_type=code token、response_type=code id_token token。

  注意:为了表明是OpenID Connect协议的请求,scope参数里必须包含OpenID。

esponse_type=code id_token

response_type=code token

response_type=code id_token token

Identity Server:

建立Identity Provider项目

dentityServer4.Templateshttps://github.com/IdentityServer/IdentityServer4.Templates

安装工具:

dotnet new -i identityserver4.templates

重置 “dotnet new” 功能列表: dotnet new --debug:reinit

模板:

dotnet new is4empty、 dotnet new is4ui 、dotnet new is4inmem 、dotnet new is4aspid、 dotnet new is4ef 、dotnet new is4admin (收费)

使用Identity Server 建立Authorization Server:https://www.cnblogs.com/cgzl/p/7780559.html

OAuth2、OpenID Connect简介的更多相关文章

  1. Identity Server 4 预备知识 -- OpenID Connect 简介

    我之前的文章简单的介绍了OAuth 2.0 (在这里: https://www.cnblogs.com/cgzl/p/9221488.html), 还不是很全. 这篇文章我要介绍一下 OpenID C ...

  2. Identity Server 4 原理和实战(完结)_----选看 OpenId Connect 简介

    Identity Procider:身份提供商

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

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

  4. OpenID Connect + OAuth2.0

    一.问题的提出 现代应用程序或多或少都是如下这样的架构: 在这种情况下,前端.中间层和后端都需要进行验证和授权来保护资源,所以不能仅仅在业务逻辑层或者服务接口层来实现基础的安全功能.为了解决这样的问题 ...

  5. IdentityServer4+OAuth2.0+OpenId Connect 详解

    一  Oauth 2.0 1 定义 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. ...

  6. ASP.NET没有魔法——ASP.NET OAuth、jwt、OpenID Connect

    上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与Jwt以及OpenID Connect之间的关系与区别. 本文主要内 ...

  7. ASP.NET OAuth、jwt、OpenID Connect

    ASP.NET OAuth.jwt.OpenID Connect 上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与J ...

  8. SSO的通用标准OpenID Connect

    目录 简介 OpenID Connect是什么 ID Token 请求ID Token ID Token可以做什么 Open Connect认证码授权的例子 User Info 简介 OpenID C ...

  9. 一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3

    今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准, ...

随机推荐

  1. Caffe源码-Layer类

    Layer类简介 Layer是caffe中搭建网络的基本单元,caffe代码中包含大量Layer基类派生出来的各种各样的层,各自通过虚函数 Forward() 和 Backward() 实现自己的功能 ...

  2. .NET Core使用RabbitMQ

    RabbitMQ简介 RabbitMQ是一个开源的,基于AMQP(Advanced Message Queuing Protocol)协议的完整的可复用的企业级消息队,RabbitMQ可以实现点对点, ...

  3. Cesium专栏-百度地图加载(附源码下载)

    Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...

  4. MySQL 有关MHA搭建与切换的几个错误log

    1:masterha_check_repl 副本集方面报错  replicates is not defined in the configuration file! 具体信息如下: # /usr/l ...

  5. 【目录】Cocos2d-x系列

    1.Cocos2d-x的坐标系统 2.Cocos2d-x 点击菜单按键居中放大(无需修改底层代码) 3.发布Cocos2d-x的PC端程序 4.Cocos2d-x游戏实例<忍者飞镖>之对象 ...

  6. Pikachu-File Inclusion, Unsafe file download & Unsafe file upload

    Pikachu-File Inclusion, Unsafe file download & Unsafe file upload 文件包含漏洞 File Inclusion(文件包含漏洞)概 ...

  7. VMware_Player_nat网络的端口映射_手工设置

    VMware_Player_nat网络的端口映射_手工设置 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-12-21. vmware nat的配置文件在 C:\ProgramDat ...

  8. ASP.NET Core gRPC 健康检查的实现方式

    一. 前言 gRPC 服务实现健康检查有两种方式,前面在此文 ASP.NET Core gRPC 使用 Consul 服务注册发现 中有提到过,这里归纳整理一下.gRPC 的健康检查,官方是定义了标准 ...

  9. Apollo 分布式配置中心(补充)

    1.   Namespace 1.1.  什么是Namespace Namespace是配置项的集合,类似于一个配置文件的概念. Apollo在创建项目的时候,都会默认创建一个“application ...

  10. python 调试大法

    说在前面 我觉得没有什么错误是调试器无法解决的,如果没有,那我再说一遍,如果有,那当我没说 一.抛出异常 可以通过 raise 语句抛出异常,使程序在我们已经知道的缺陷处停下,并进入到 except ...