主要用于第三方应用登录,例如使用QQ或微信登录其他的应用或网站等。目的在于限制用户身份,有效的身份才能浏览相关的内容。这就是认证授权!!

1 OpenID

  它是一种认证标准,用户要使用OpenID就必须在OpenID身份服务器(Identity Provider, IDP)上注册OpenID账号,例如OpenID账号为谷歌账号或QQ账号,可以使用它们登录其他的应用(the relying party,RP,依赖方)等。相当于一个框架用来提供IDP与RP之间的通信,例如QQ与Process On的通信(使用QQ登录Process On)。
用户的OpenID本质上是用户拥有的一个特殊的URL(例如,fang.openid.com

1.1 OpenID Connect(OIDC)

  OpenID是Authentication,即认证,对用户的身份进行认证,判断其身份是否有效,也就是让网站知道“你是你所声称的那个用户”;
  OAuth是Authorization,即授权,在已知用户身份合法的情况下,经用户授权来允许某些操作,也就是让网站知道“你能被允许做那些事情”。
  只有在确定用户身份之后才能进行授权。
即 身份验证+QAuth 2.0 = OpenID Connect

1.2 OIDC流程

  OAuth2提供了Access Token来解决授权第三方客户端访问受保护资源的问题;相似的,OIDC在这个基础上提供了ID Token来解决第三方客户端标识用户身份认证的问题。
  其核心在于OAuth 2.0流程中,一并提供用户的身份认证信息(ID-Token)给到第三方客户端,ID-Token使用JWT格式来包装。JWT(JSON Web Token)的自包含性,紧凑性以及防篡改机制,使得ID-Token可以安全的传递给第三方客户端程序并且容易被验证。

1.2.1 例如使用QQ登录第三方应用process on

 EU:End User,用户自身。
 RP:Relying Party ,用来代指OAuth2中的受信任的客户端,身份认证和授权信息的消费方;prodess on服务商
 OP:OpenID Provider,有能力提供EU身份认证的服务方(比如OAuth2中的授权服务),用来为RP提供EU的身份认证信息;QQ
 ID-Token:JWT格式的数据,包含EU身份认证的信息。
 UserInfo Endpoint:用户信息接口(受OAuth2保护),当RP使用ID-Token访问时,返回授权用户的信息,此接口必须使用HTTPS。
  根据客户端的不同,OIDC的工作模式也不同。JS应用中,代码会加载到浏览器,不能保证客户端密钥的安全性,这是默认模式流程;传统的应用,C/S模式客户端与服务端隔离保证客户端密钥(client_secret)的安全性这是授权码模式流程;此外还有混合模式流程即以上两种模式混合。

1.3 授权模式流程

  按照以上的例子,流程如下:

  1. Process On服务商向QQ发送一个请求,其中附带client_id
  2. QQ对用户身份进行验证
  3. QQ返回响应,发送授权码给Process On
  4. Process On使用授权码向QQ索要ID-Token和Access-Token
  5. Process On使用Access-Token发送一个请求到UserInfo EndPoint; UserInfo EndPoint返回用户的Claims

1.3.1 认证请求

  应用使用OAuth2的Authorization-Code的方式来完成用户身份认证,构建一个OIDC的Authentication Request需要提供如下的参数:scope,response_type,client_id,redirect_uri,state。

1.3.2 请求响应

  QQ接收到认证请求后,进行验证并进行授权。之后,会重定向到Process On指定的回调地址,并把授权码code和state参数传递过去。例如https://Process On.example.org/cb?
code=SplxlOBeZQQYbYS6WxSbIA
&state=af0ifjsldkj

1.3.3 获取ID Token

  Process On使用上面获取的code来请求token接口(Token EndPoint),之后接口返回响应的Token,其中除了OAuth2规定的部分数据外,还会附加一个id_token的字段。
例如:

HTTP/1.1 200 OK
  Content-Type: application/json
  Cache-Control: no-store
  Pragma: no-cache

  {
   "access_token": "SlAV32hkKG",
   "token_type": "Bearer",
   "refresh_token": "8xLOxBtZp8",
   "expires_in": 3600,
   "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc
     yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5
     NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ
     fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz
     AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q
     Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ
     NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd
     QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS
     K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4
     XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg"
  }

上面的乱码就是JWT格式的id_token
在RP拿到这些信息之后,需要对id_token以及access_token进行验证。到此基本完成了认证。

1.3.4 id_token的构成

iss = Issuer Identifier:必须。提供认证信息者的唯一标识。一般是Url的host+path部分;
sub = Subject Identifier:必须。iss提供的EU的唯一标识;最长为255个ASCII个字符;
aud = Audience(s):必须。标识ID-Token的受众。必须包含OAuth2的client_id;
exp = Expiration time:必须。ID-Token的过期时间;
iat = Issued At Time:必须。JWT的构建的时间。
auth_time = AuthenticationTime:EU完成认证的时间。如果RP发送认证请求的时候携带max_age的参数,则此Claim是必须的。
nonce:RP发送请求的时候提供的随机字符串,用来减缓重放攻击,也可以来关联ID-Token和RP本身的Session信息。
acr = Authentication Context Class Reference:可选。表示一个认证上下文引用值,可以用来标识认证上下文类。
amr = Authentication Methods References:可选。表示一组认证方法。
azp = Authorized party:可选。结合aud使用。只有在被认证的一方和受众(aud)不一致时才使用此值,一般情况下很少使用。

{
   "iss": "https://server.example.com",
   "sub": "24400320",
   "aud": "s6BhdRkqt3",
   "nonce": "n-0S6_WzA2Mj",
   "exp": 1311281970,
   "iat": 1311280970,
   "auth_time": 1311280969,
   "acr": "urn:mace:incommon:iap:silver"
  }

2 OAuth 2.0

  OAuth2是一个授权协议,是OIDC的基础协议,但是OpenID-Connect是认证协议(在OpenID-Connect中,ID-Token也被当做是一种资源)。
  OAuth2提供了一种代理访问机制,也就是说在授权后不必将自己的QQ用户名密码等身份凭据给Process On应用。OAuth2是通过IDP给第三方应用颁发令牌(Token)来实现以上功能的,第三方应用通过使用令牌向资源服务换取对应的资源。
  例如在第三方网站填写简历时可以授权从其他网站智联网中导入自己的简历。这第三方不会获得智联网上自己的用户名和密码等信息。这其中的网站与智联网就使用了OAuth2授权协议。
其中包含一下对象:
第三方应用(客户端):智联招聘网站服务,用于存储简历
API:智联网上的资源服务器,保存相关的资源,网站存储用户信息以及简历
授权服务器:网站上的授权接口,用于同意或否决用户请求
用户:用户本身,简历资源的拥有者

3 SAML

  作为一种安全性断言标记语言,SAML协议既可以用于认证也用于授权。可用于同域名下不同子域的单点登录。
安全性断言:关于认证、授权以及用户属性(用户信息)的声明集合,断言以XML格式传输
  首先例如服务提供商QQ音乐会向QQ发出SAML认证请求,请求中以xml格式说明了认证方式的设置,比如QQ希望以什么方式验证用户。QQ在验证用户后会返回用户身份和相关属性,发送断言信息必须要使用数字签名。QQ音乐收到SAML断言后验证消息是否可信,之后解析xml获得认证信息。

Logo

Authing 是一款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务

更多推荐