OAuth介绍 - 使用场景
OAuth是一个开放的授权协议,它提供一个方法可以让你授权某个人来代表你去访问你保存在服务器上的资源,但不会向你的代表泄露你的登录密码。本文主要描述OAuth的使用场景,以帮助用户理解OAuth能帮助解决什么问题。
OAuth是一个开放的授权协议,它提供一个方法可以让你授权某个人来代表你去访问你保存在服务器上的资源,但不会向你的代表泄露你的登录密码。本文主要描述OAuth的使用场景,以帮助用户理解OAuth能帮助解决什么问题。
0. 使用场景所涉及的参与者
(1) Service Provider (photos.example.net),它是一个提供照片存储服务的网站
(2) Consumer (printer.example.com),它是一个提供照片打印服务的网站
(3) User:Jane
需求:Jane的照片vacation.jpg存储在photos.example.net上,她使用username和password登录后可以访问该照片(即访问一个URL地址
http://photos.example.net/photo?file=vacation.jpg),但其它人无法访问她的照片。现在她想使用printer.example.com提供的打印服务,但又不想泄
露她在photos.example.net上的username和password。
1. 注册
Service Provider (photos.example.net)公开Consumer Key和Consumer Secret的使用方法及如下URL地址:
https://photos.example.net/request_token, 使用HTTP POST
http://photos.example.net/authorize, 使用HTTP GET
https://photos.example.net/access_token, 使用HTTP POST
若Consumer (printer.example.com)在Service Provider (photos.example.net)上注册成功后,将可能获得如下的凭证:
Consumer Key: dpf43f3p2l4k3l03
Consumer Secret: kd94hf93k423kf44
至此,Consumer 便可以打广告说:“我们可以提供photos.example.net上的照片打印服务了”。
2. 获取访问请求令牌(Request Token)
若Jane告知Consumer (printer.example.com)去打印存放在photos.example.net上的私有照片,Consumer 将去访问照片的URL,但第一次将返回“未授权访
问”的错误信息,并且header信息中包含:WWW-Authenticate: OAuth realm="http://photos.example.net/"。
Consumer将向Service Provider发送HTTP POST访问请求:
https://photos.example.net/request_token?
oauth_consumer_key=dpf43f3p2l4k3l03&
Oauth_signature_method=PLAINTEXT&
Oauth_signature=kd94hf93k423kf44%26&
Oauth_timestamp=1191242090&
Oauth_nonce=hsu94j3884jdopsl&
oauth_version=1.0
Service Provider将验证签名,然后返回一个未授权的Request Token:
oauth_token=hh5s93j4hdidpola&
oauth_token_secret=hdhd0244k9j7ao03
3. 请求用户授权(User Authorization)
Consumer将重定向Jane的浏览器到Service Provider的Authorization URL,以获取Jane的许可:
http://photos.example.net/authorize?
oauth_token=hh5s93j4hdidpola&
oauth_callback=http%3A%2F%2Fprinter.example.com%2Frequest_token_ready
Service Provider要求Jane登录认证,如果认证成功,则询问Jane是否同意printer.example.com去访问她的私有照片。如果Jane许可此次访问,Service
Provider将重定向到Consumer的URL:
http://printer.example.com/request_token_ready?
oauth_token=hh5s93j4hdidpola
4. 获取访问令牌(Access Token)
现在Consumer知道Jane已经对Request Token进行了批准,下面将向Service Provider请求Access Token:
https://photos.example.net/access_token?
oauth_consumer_key=dpf43f3p2l4k3l03&
oauth_token=hh5s93j4hdidpola&
oauth_signature_method=PLAINTEXT&
oauth_signature=kd94hf93k423kf44%26hdhd0244k9j7ao03&
oauth_timestamp=1191242092&
oauth_nonce=dji430splmx33448&
oauth_version=1.0
Service Provider将验证签名,然后返回Access Token:
oauth_token=nnch734d00sl2jdk&
oauth_token_secret=pfkkdhi9sl3r4s00
5. 访问Jane的私有照片
由于照片URL是不安全的HTTP,所以需使用消息认证方法,如HMAC-SHA1。
(1) 准备待签名基串(Signature Base String)
访问请求将包含如下参数:
oauth_consumer_key:
dpf43f3p2l4k3l03
oauth_token:
nnch734d00sl2jdk
oauth_signature_method:
HMAC-SHA1
oauth_timestamp:
1191242096
oauth_nonce:
kllo9940pd9333jh
oauth_version:
1.0
file:
vacation.jpg
size:
original
那么,待签名基串将包含如下内容:
1) GET
2) http://photos.example.net/photos
3) file=vacation.jpg&
oauth_consumer_key=dpf43f3p2l4k3l03&
oauth_nonce=kllo9940pd9333jh&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1191242096&
oauth_token=nnch734d00sl2jdk&
oauth_version=1.0&
size=original
(2) 计算签名
使用HMAC-SHA1计算上述基串的HMAC值(注意:此处将使用Consumer Secret & oauth_token_secret作为key,即kd94hf93k423kf44&pfkkdhi9sl3r4s00),
得到一个base64编码结果:tR3+Ty81lMeYAr/Fid0kMTYa/WM=
(3) 访问请求
Consumer使用如下的方法去访问Jane的照片:
http://photos.example.net/photos?file=vacation.jpg&size=original
Authorization: OAuth realm="http://photos.example.net/",
oauth_consumer_key="dpf43f3p2l4k3l03",
oauth_token="nnch734d00sl2jdk",
oauth_signature_method="HMAC-SHA1",
oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D",
oauth_timestamp="1191242096",
oauth_nonce="kllo9940pd9333jh",
oauth_version="1.0"
Service Provider (photos.example.net)将检查签名,如果验证成功则返回访问结果。
参考文献:
[1] OAuth Core 1.0, http://oauth.net/core/1.0/