当我们在登录一些网站的时候,需要第三方的登录。比如,现在我们要登录简书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. 2019最新EI源刊目录

    2D Materials Journal3D Printing and Additive Manufacturing Journal3D Research Journal3DTV-Conference ...

  2. JVM 学习笔记一 :JVM类加载机制

    前言: 最近在看JVM相关资料,这里记录下学习笔记,希望自己能坚持学完,打牢基础.   一.类加载过程 1,类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载.验证.准备.解析.初始化.使用 ...

  3. IEEE754 32位浮点数表示范围

    6.1浮点数的数值范围 根据上面的探讨,浮点数可以表示-∞到+∞,这只是一种特殊情况,显然不是我们想要的数值范围. 以32位单精度浮点数为例,阶码E由8位表示,取值范围为0-255,去除0和255这两 ...

  4. Django-如何写好一个celery定时任务

    1.首先在项目同名目录下建一个celery.py from __future__ import absolute_import import os from celery import Celery ...

  5. LinuxProbe小结

    1.修改主机名: /etc/hostname 2.配置 yum 软件仓库: (1)进入到 /etc/yum.repos.d/目录下,创建一个linuxprobe.repo的新文件(文件名称任意,结尾必 ...

  6. ECMAScript 5 特性

    ECMAScript 5 也称为 ES5 和 ECMAScript 2009. ECMAScript 5 特性 这些是 2009 年发布的新特性: "use strict" 指令 ...

  7. 使用EasyPOI导入导出图片出现数组越界异常

    在我使用easypoi做导出功能的时候,突然抛了一个数组越界异常,找了很久也没找到,最后猜想有可能是路径出了问题,然后打印了一下图片存放的路径,结果发现在其保存路径上存在“.”,也就是easypoi底 ...

  8. 数据结构学习--单循环链表(python)

    概念 将单链表的终端节点的指针由原来的空指针改为指向头节点, 就是整个单链表形成一个环, 这种首尾相接的单链表称为单循环链表. 实现 class Node: """ 节点 ...

  9. Create a Report at Runtime 在运行时创建报表

    In this lesson, you will learn how to create reports at runtime. A report showing a list of Tasks wi ...

  10. GO基础之延时执行

    一.延迟是什么?•即延迟( defer)语句,延迟语句被用于执行一个函数调用,在这个函数之前,延迟语句返回. 一.延迟函数 1.可以在函数中添加多个defer语句.•当函数执行到最后时,这些defer ...