授权(Authorization)与认证(Authentication)
OAuth2授权框架(Authorization)
概念
-
在不提供账号密码信息的情况下访问特定私有资源的一种开放授权标准
-
核心思路
- 由Authorization Server提供一个访问凭据给第三方Client,通过凭据,第三方的Client可以在没有Resource Owner的账号信息的情况下访问resource server上的资源。
角色
-
1.Resource Owner
- 资源拥有者
-
2.Resouce Server
- 存储资源的服务器
-
3.Client
- 第三方客户端
-
4.Authorization Server
- 授权服务器
- 管理上述三者的关系的中间层
- 一般由Resource server提供授权服务
部署步骤
- 1.添加Authorization Server,提供授权具体实现
- 2.Resource server为第三方Client提供注册接口
- 3.Resource server开放相应的受保护资源的Api
- 4.Client注册成为Resource server所信任的第三方应用
- 5.Client消费所需的Api
基本流程
-
1.第三方应用请求用户授权。
-
1.Client提供快速登录引导页,引导用户跳转到指定页面同意授权
-
-
参数
-
response_type
- 验证方式
-
client_id
- 授权服务器提供的id
-
redirect_uri
-
授权成功跳转到指定的redirect_url
- 一般是网站的首页或者用户中心
- 例如:www.myWeb.com/my.php
-
-
scope
- 请求范围
-
state
- 防止重复攻击的状态标志
-
-
-
-
-
2.用户同意授权,并返回一个凭证(code)
-
code由授权服务器颁发
-
此时授权服务器会在我们提供的redirect_uri后附加上code参数并重定向
- www.myWeb.com/my.php?code…******
- 如果上一步Client提供了State,则授权服务器会原样返回
-
-
3.第三方应用通过第二步的凭证(code)向授权服务器请求授权
-
附上code发送请求至授权服务器
-
-
参数
-
grant_type
- 固定值authorization_code
-
client_id
- 授权服务器提供的id
-
client_secret
- 授权服务器提供的key
-
code
- 上一步获取的code
-
redirect_uri
- 同上
-
-
-
-
此步骤对用户不可见,又第三方服务器后台完成
-
-
4.授权服务器验证凭证(code)通过后,同意授权,并返回一个资源访问的凭证(Access Token)。
-
返回信息
- { "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"example", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", "example_parameter":"example_value" }
-
此步骤对用户不可见,又第三方服务器后台完成
-
-
5.第三方应用通过第四步的凭证(Access Token)向资源服务器请求相关资源。
-
此步骤对用户不可见,又第三方服务器后台完成
-
Token传递方式
-
URI Query Parameter
- 通过get方式附加到参数后
- GET /resource?access_token=mF_9.B5f-4.1JqM HTTP/1.1
-
Authorization Request Header Field
- 在Header头添加Authorization: Bearer xxxx
-
Form-Encoded Body Parameter
- 使用post方式添加到body里
-
-
-
6.资源服务器验证凭证(Access Token)通过后,将第三方应用请求的资源返回。
授权类型response_type
-
Authorization Code(授权码模式)
- 最常用的一种模式
- response_type:code
-
Implicit:隐式许可
-
Authorization Code的简化版本
-
不同点
-
response_type:token
-
省略颁发code这一步骤,直接返回access Token
-
适用于没有Server服务器来接受处理Authorization Code的第三方应用
-
Access Token Response返回
- Location: client.example.com/oauth2#acce…
- code模式是返回一个结构体,而此模式直接在url后的hash中返回
-
-
-
Resource Owner Password Credentials: 资源所有者密码凭据
-
Client直接使用Resource owner提供的username和password来直接请求access_token(直接发起Access Token Request然后返回Access Token Response信息
-
这种模式一般适用于Resource server高度信任第三方Client的情况下。
-
不同点
-
省略了Authorization Request和Authorization Response
-
请求格式参数
- grant_type:必选。值固定为“password”。
- username:必选。用户登陆名。
- passward:必选。用户登陆密码。
- scope:可选。表示授权范围。
-
-
-
Client Credentials :客户端凭据
-
Client直接已自己的名义访问Resource server
-
不同点
-
请求参数
- grant_type:必选。值固定为“client_credentials”。
- scope:可选。表示授权范围。
-
-
刷新access_token
-
提供参数
-
grant_type:必选。固定值“refresh_token”。
-
refresh_token:必选。客户端得到access_token的同时拿到的刷新令牌。
- grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
-
OpenID Connect(OIDC)
(Authentication)认证
特点
- 1.OIDC=(Identity, Authentication) + OAuth 2.0
- 2.它在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。
- 3.OIDC使用OAuth2的授权服务器来为第三方客户端提供用户的身份认证,并把对应的身份认证信息传递给客户端
- 4.完全兼容OAuth2
协议簇
- Core
- Discovery
- Dynamic Registration
- other...
主要术语和概念
-
-
EU:End User
- 一个人类用户
-
-
-
RP:Relying Party
- 受信任的客户端
- 相当于OAuth2中Client
-
-
3.OP:OpenID Provider
- 为RP提供EU的身份认证信息
- 相当于OAuth2中的授权服务
- 向RP提供ID Token 和 Access Token
-
4.ID Token
- JWT格式的数据
- 包含EU的身份信息
-
5.UserInfo Endpoint
- 用户信息接口
- RP需要使用Access Token进行访问,返回授权用户信息
工作流程
-
- RP 发送一个认证请求给 OP
-
- OP对 EU进行身份认证,然后提供授权
-
- OP把ID Token和Access Token(如果需要)返回给RP
-
- RP 使用Access Token 发送请求到UserInfo EndPoint
- 5.UserInfo EndPoint 返回 EU的Claims
JWT
结构
-
header
-
{ "alg": "HS256", "typ": "JWT" }
-
alg
- 签名算法
-
typ
- token类型
-
-
-
payload
- 包含一组Claim
-
signature
- 签名,使用私钥通过签名算法生成
Claims
-
iss
- Issuer签发者
-
sub
- subject 受众
-
aud
- Audience 接收方
-
exp
- Expiration Time 过期时间
-
iat
- Issued At 签发时间
-
其它
应用场景
- 1.设置到cookie上
-
- Authorization: Bearer