zoukankan      html  css  js  c++  java
  • Spring Security 与 OAuth2(介绍)

    https://www.jianshu.com/p/68f22f9a00ee

    Spring Security 与 OAuth2(介绍)

    2018.01.23 11:14* 字数 3097 阅读 3660评论 1

    个人 OAuth2 全部文章

    摘要:使用OAuth2 认证的好处就是你只需要一个账号密码,就能在各个网站进行访问,而面去了在每个网站都进行注册的繁琐过程,如:很多网站都可以使用微信登录,网站作为第三方服务、微信作为服务提供商

    OAuth2 角色

    • resource owner:资源所有者(指用户)
    • resource server:资源服务器存放受保护资源,要访问这些资源,需要获得访问令牌(下面例子中的 Twitter 资源服务器)
    • client:客户端代表请求资源服务器资源的第三方程序(下面例子中的 Quora)客户端同时也可能是一个资源服务器
    • authrization server:授权服务器用于发放访问令牌给客户端(下面例子中的 Twitter 授权服务器)

    OAuth2 工作流程例子

    • 客户端 Quora 将自己注册到授权服务器上
    • 用户访问 Quora 主页,它显示了各种登陆选项
    • 当用户点击使用 Twitter 登陆时,Quora 打开一个新窗口,将用户重定向到 Twitter 的登陆页面上
    • 在这个新窗口中,用户使用他的账号密码登陆了 Twitter
    • 如果用户之前未授权 Quora 应用程序使用他们的数据,则 Twitter 要求用户授权 Quora 来访问用户信息权限,如果用户已授权 Quora,此步骤则被跳过
    • 经过正确的身份验证,Twitter 将用户和一个身份验证代码重定向到 Quora 的重定向 URI
    • Quora 发送客户端 ID、客户端令牌和身份验证代码到 Twitter
    • Twitter 验证这些参数后,将访问令牌发送到 Quora
    • 成功获取访问令牌后用户被登陆到 Quora 上,用户登录 Quora 后点击他们的个人资料页面
    • Quora 从 Twitter 资源服务器请求用户的资源,并发送访问令牌
    • Twitter 资源服务器使用 Twitter 授权服务器验证访问令牌
    • 成功验证访问令牌后,Twitter 资源服务器向 Quora 提供所需要的资源
    • Quora 使用这些资源,并最终显示用户的个人资料页面
    dtcoz.png

    OAuth2 授权模式(出自阮一峰OAuth2博客)

    授权码模式

    • 授权码模式是功能最完整、流程最严密的授权模式,它的特点是通过客户端的后台服务器,与“服务器提供”的认证服务器进行互动
    9434708-a464c0c64ca6ee9a.png
    • 它的步骤如下:
      • (A)用户访问客户端,后者将前者导向认证服务器
      • (B)用户选择是否给予客户端授权
      • (C)假设用户给予授权,认证服务器将用户导向客户端事先指定的“重定向 URI”,同时附上一个授权码
      • (D)客户端收到授权码,附上早先的“重定向 URI”向认证服务器申请令牌,这一步是在客户端的后台服务器上完成的,对用户不可见
      • (E)认证服务器核对了授权码和重定向URI,确认无误后向客户端发送令牌和更新令牌
    • 上述步骤中所需要的参数:
      • A步骤中,客户端申请认证的 URI,包含以下参数:
        • repsone_type:授权类型,必选,此处固定值“code”
        • client_id:客户端的ID,必选
        • client_secret:客户端的密码,可选
        • redirect_uri:重定向URI,可选
        • scope:申请的权限范围,可选
        • state:客户端当前的状态,可以指定任意值,认证服务器会原封不动的返回这个值
        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
        
      • C步骤中,服务器回应客户端的URI,包含以下参数:
        • code:表示授权码,必须按,该码有效期应该很短,通常10分钟,客户端只能使用一次,否则会被授权服务器拒绝,该码与客户端 ID 和 重定向 URI 是一一对应关系
        • state:如果客户端请求中包含着歌参数,认证服务器的回应也必须一模一样包含这个参数
        HTTP/1.1 302 Found
        Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
        &state=xyz
        
      • D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:
        • grant_type:表示使用的授权模式,必选,此处固定值为“authorization_code”
        • code:表示上一步获得的授权吗,必选
        • redirect_uri:重定向URI,必选,与步骤 A 中保持一致
        • client_id:表示客户端ID,必选
        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
        
      • E步骤中,认证服务器发送的HTTP回复,包含以下参数:
        • access_token:表示令牌,必选
        • token_type:表示令牌类型,该值大小写不敏感,必选,可以是 bearer 类型或 mac 类型
        • expires_in:表示过期时间,单位为秒,若省略该参数,必须设置其它过期时间
        • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选
        • scope:表示权限范围
        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"
             }
        
      • 从上面代码可以看到,参数使用 JSON 格式发送(Content-Type: application/json),才外,HTTP头信息中明确指定不得缓存

    简化模式

    • 简化模式不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了“授权码”这个步骤
    bg2014051205.png
    • 它的步骤如下:
      • (A)客户端将用户导向认证服务器
      • (B)用户决定是否给予客户端授权
      • (C)假设用户给予授权,认证服务器将用户导向客户端指定的“重定向URI”,并在URI的Hash部分包含了访问令牌
      • (D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值
      • (E)资源服务器返回一个网页,其中包含了代码可以获取Hash值中的令牌
      • (F)浏览器执行上一步获得的脚本,取出令牌
      • (G)浏览器将令牌发给客户端
    • 上述步骤中所需要的参数:
      • A步骤中,客户端发出HTTP请求,包含以下参数:
        • response_type:表示授权类型,此处固定值为"token",必选
        • client_id:表示客户端ID,必选
        • redirect_uri:表示重定向URI,可选
        • scope:表示权限范围,可选
        • state:表示客户端当前状态,可指定任意值,认证服务器会原封不动返回这个值
        GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
        Host: server.example.com
        
      • C步骤中,认证服务器回应客户端的URI,包含以下参数:
        • access_token:表示访问令牌,必选
        • token_type:表示令牌类型,该值大小写不敏感,必选
        • expires_in:表示过期时间,单位为秒
        • scope:表示权限范围,如果与客户端申请的范围一致,可忽略
        • state:如果客户端请求中包含这个参数,认证服务器也要返回一模一样的参数
        HTTP/1.1 302 Found
        Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
        &state=xyz&token_type=example&expires_in=3600
        
    • 上面例子中,认证服务器用HTTP头信息的Location栏,指定浏览器重定向的网址,注意,这个网址的Hash部分包含了令牌
    • 根据D步骤,下一步浏览器会访问Location指定的网址,但是Hash部分不会被发送,接下来的E步骤,服务提供商的资源服务器发送过来的代码,提取出Hash令牌

    密码模式

    • 密码模式中,用户向客户端提供自己的用户名和密码,客户端使用这些信息向“服务提供商”索要授权

    • 在这种模式中,用户必须把密码给客户端,但客户端不得存储密码,这通常在用户对客户端高端信任的情况下,比如客户端是操作系统的一部分,由一个著名的公司出品,而认证服务器只有在其它授权模式无法执行的情况下,才考虑该模式

    9434708-6165f69e2bfc8881.png
    • 它的步骤如下:
      • (A)用户向客户端提供用户名和密码
      • (B)客户端将用户名密码发送认证给服务器,向后者请求令牌
      • (C)认证服务器确认无误后,向客户端提供访问令牌
    • 上述步骤中所需要的参数:
      • B步骤中,客户端发出HTTP请求,包含以下参数:
        • grant_type:授权类型,必选,此处固定值“password”
        • username:表示用户名,必选
        • password:表示用户密码,必选
        • scope:权限范围,可选
        POST /token HTTP/1.1
         Host: server.example.com
         Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
         Content-Type: application/x-www-form-urlencoded
        
         grant_type=password&username=johndoe&password=A3ddj3w
        
      • C步骤中,认证服务器向客户端发送访问令牌,下面是一个例子:
        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"
         }
        

    客户端模式

    • 客户端模式指客户端以自己名义,而不是用户名义,向“服务提供商”进行认证,严格地说,客户端模式不属于OAuth框架要解决的问题,在这种模式中,用户直接向客户端注册,客户端以自己名义要求“服务提供商”提供服务
    bg2014051207.png
    • 它的步骤如下:
      -(A):客户端向认证服务器进行身份认证,并要求一个访问令牌
      -(B):认证服务器确认无误后,向客户端提供访问令牌

    • 上述步骤中所需要的参数:

      • A步骤中,客户端发出HTTP请求,包含以下参数:

        • granttype:表示授权类型,此处固定值为“clientcredentials”,必选
        • scope:表示权限范围,可选
         POST /token HTTP/1.1
         Host: server.example.com
         Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
         Content-Type: application/x-www-form-urlencoded
         grant_type=client_credentials
        
      • B步骤中,认证服务器向客户端发送访问令牌,下面是一个例子

         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,
           "example_parameter":"example_value"
         }
        

    更新令牌

    • 如果用户访问的时候,客户端“访问令牌”已经过期,则需要使用“更新令牌”申请一个新的令牌
    • 客户端发出更新令牌请求,包含以下参数:
      • granttype:表示授权模式,此处固定值为“refreshtoken”,必选
      • refresh_token:表示早前收到的更新令牌,必选
      • scope:表示申请权限范围,不得超出上一次申请的范围,若省略该参数,则表示与上一次一样
       POST /token HTTP/1.1
       Host: server.example.com
       Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
       Content-Type: application/x-www-form-urlencoded
       grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
      
  • 相关阅读:
    mysql修改数据表名
    HDU 5742 It's All In The Mind (贪心)
    HDU 5752 Sqrt Bo (数论)
    HDU 5753 Permutation Bo (推导 or 打表找规律)
    HDU 5762 Teacher Bo (暴力)
    HDU 5754 Life Winner Bo (博弈)
    CodeForces 455C Civilization (并查集+树的直径)
    CodeForces 455B A Lot of Games (博弈论)
    CodeForces 455A Boredom (DP)
    HDU 4861 Couple doubi (数论 or 打表找规律)
  • 原文地址:https://www.cnblogs.com/yibutian/p/9504354.html
Copyright © 2011-2022 走看看