授权应用场景
开发者需要根据各自的应用场景,选择适用的OAuth2.0授权流程:
- 网站或者站外Web应用,请参考:Authorization Code流程;
- 桌面和无线客户端应用,请参考:Authorization Code流程,无server端的也可以使用Implicit Grant流程,无线客户端可以直接使用官方SDK,通过WebView方式使用授权页;
- 针对云平台的API授权,只是针对开发者,参考:百度OAuth2.0对外提供的开发者授权方式Developer Credentials。
以下介绍了三种应用场景方便开发者熟悉授权流程。
Server端使用百度OAuth2.0授权调用开放API流程
Authorization Code | 又称Web Server Flow,适用于所有有Server端配合的应用。 | 有效期一个月的Access Token+有效期十年的Refresh Token。 |
(A) get code <= http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=TG3X5KahFVkmik87Rf46gLMU&redirect_uri=oob&scope=netdisk%20basic&display=page
(B) get access code <= https://openapi.baidu.com/oauth/2.0/token?client_id=TG3X5KahFVkmik87Rf46gLMU&client_secret=F9WIzAVVvEjVP9nuQV1AaoO8NpgIi5UA&grant_type=authorization_code&code=7d4dd5aef9f6b36adfc8556b51cc1d93&redirect_uri=oob
1. 引导用户到如下地址进行授权:
2. 如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE 。
3. 换取Access Token。
返回值
4. 使用获得的OAuth2.0 Access Token调用API
移动端使用百度OAuth2.0授权调用开放API流程
Implicit Grant | 又称User-Agent Flow,适用于所有无Server端配合的应用(桌面客户端需要内嵌浏览器)。 | 有效期一个月的Access Token。 |
1. 引导用户到如下地址进行授权:
2. 如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI 在Fragment中追加如下参数。
3. 截获OAuth2.0 Access Token调用API。
设备使用百度OAuth2.0授权调用开放API流程
Device | 适用于一些输入受限的设备上(如只有数码液晶显示屏的打印机、电视机等)。 | 有效期一个月的Access Token+有效期十年的Refresh Token。 |
(A) get user_code <= curl -k -L -d "client_id=TG3X5KahFVkmik87Rf46gLMU&response_type=device_code&scope=basic,netdisk" "https://openapi.baidu.com/oauth/2.0/device/code"
(B) get access code <= http://openapi.baidu.com/device?code=itpj3wd9&display=page&redirect_uri=&force_login=
1. 获取User Code和Device Code :
2. 授权服务会返回一段JSON文本,其中包含一个二维码图片地址。
3. 引导用户通过其他终端去百度填写User Code并授权。
4.通过Device Code获取Access Token。
5. 使用获得的OAuth2.0 Access Token调用API。
获取Access Token
总体介绍
OAuth2.0(开放授权)是一个开放标准,用户授权后,第三方应用无需获取用户的用户名和密码就可以访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表)。
Access Token:用户身份验证和授权的凭证。第三方应用在调用百度开放API之前,首先需要获取Access Token。
目前,百度OAuth2.0支持五种获取Access Token的流程和一种刷新获取AccessToken方式,第三方可根据需求选取合适的方式:
百度授权的Access Token是有有效期的,这样会影响用户的体验和增加开发者的工作。所以平台提供了一种方式可以保证授权有效期为永久。
- 实现方式:返回给第三方一个月有效期的Access Token + 十年有效期的Refresh Token。
- 实现原理:Refresh Token的作用就是在Token有效期截止前,刷新以获取新的Access Token。
获取途径 | 授权流程 | 介绍 | 有效期 |
---|---|---|---|
新获取 | Authorization Code | 又称Web Server Flow,适用于所有有Server端配合的应用。 | 有效期一个月的Access Token+有效期十年的Refresh Token。 |
Implicit Grant | 又称User-Agent Flow,适用于所有无Server端配合的应用(桌面客户端需要内嵌浏览器)。 | 有效期一个月的Access Token。 | |
Client Credentials | 即采用应用公钥、密钥获取Access Token,适用于任何带server类型应用。 通过此授权方式获取Access Token仅可访问平台授权类的接口。 | 有效期一个月的Access Token+有效期十年的Refresh Token。 | |
Device | 适用于一些输入受限的设备上(如只有数码液晶显示屏的打印机、电视机等)。 | 有效期一个月的Access Token+有效期十年的Refresh Token。 | |
刷新 | Refresh Token | Access Token刷新方式,适用于所有有Server端配合的应用 。 | 十年刷新期限。 |
Client Credentials授权
简介
采用Client Credentials方式,即应用公钥、密钥方式获取Access Token,适用于任何类型应用,但通过它所获取的Access Token只能用于访问与用户无关的Open API,并且需要开发者提前向百度开放平台申请,成功对接后方能使用。其流程示意图如下:
![oauth%2Fclient_credentials.gif](http://bcs.duapp.com/open-api/oauth%2Fclient_credentials.gif)
对于应用而言,其流程只有一步,即直接获取Access Token。
获取Access Token
请求数据包格式
使用Client Credentials获取Access Token需要应用在其服务端发送请求(推荐用POST方法)到百度OAuth2.0授权服务的“https://openapi.baidu.com/oauth/2.0/token”地址上,并带上以下参数:
-
- grant_type:必须参数,固定为“client_credentials”;
- client_id:必须参数,应用的API Key;
- client_secret:必须参数,应用的Secret Key;
- scope:非必须参数。以空格分隔的权限列表,采用本方式获取Access Token时只能申请跟用户数据无关的数据访问权限。关于权限的具体信息请参考“权限列表”。
例如:
https://openapi.baidu.com/oauth/2.0/token?
grant_type=client_credentials&
client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&
响应数据包格式
响应数据包格式
若参数无误,服务器将返回一段JSON文本,包含以下参数:
-
- access_token:要获取的Access Token;
- expires_in:Access Token的有效期,以秒为单位;请参考“Access Token生命周期”
- refresh_token:用于刷新Access Token 的 Refresh Token,所有应用都会返回该参数;(10年的有效期)
- scope:Access Token最终的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限),关于权限的具体信息参考“权限列表”一节;
- session_key:基于http调用Open API时所需要的Session Key,其有效期与Access Token一致;
- session_secret:基于http调用Open API时计算参数签名用的签名密钥。
例如:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
"expires_in": 86400,
"refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328",
"scope": "public",
"session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn",
"session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
}
若请求错误,服务器将返回一段JSON文本,包含以下参数:
-
- error:错误码;关于错误码的详细信息请参考“百度OAuth2.0错误响应”。
- error_description:错误描述信息,用来帮助理解和解决发生的错误。
例如:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"
}
开发者需要注意的事项
-
- 默认情况下,Access Token的有效期为一个月,如果Access Token过期可以重新获取。
-
- 获取Access Token时所返回的session_key和session_secret参数不是OAuth2.0协议标准规定的返回参数,而是百度OAuth2.0服务扩展加入的,目的是使得开发者可以基于http调用百度的Open API,因为基于https调用Open API虽然更为简单,但毕竟响应速度更差(比基于http的要差一倍时间左右)。
Refresh Token
简介
对于从百度开放平台申请到允许永久授权权限的应用,无论其采用Authorization Code、Reource Owner Password Credentials、Client Credentials中的哪一个去获取Access Token,都会拿到一个有效期为个月的Access Token和有效期为10年的Refresh Token对于这些应用,只要用户在10年内登陆应用,应用就可以使用Refresh Token刷新以获得新的Access Token(新的Refresh Token也会同时下发),从而达到只要用户不连续10年未登陆过你的应用就不需要重新登陆的目的。
获取Access Token
请求数据包格式
使用Refresh Token刷新以获得新的Access Token,需要应用在其服务端发送请求(推荐用POST方法)到百度OAuth2.0授权服务的“https://openapi.baidu.com/oauth/2.0/token”地址上,并带上以下参数:
-
- grant_type:必须参数,固定为“refresh_token”;
- refresh_token:必须参数,用于刷新Access Token用的Refresh Token;
- client_id:必须参数,应用的API Key;
- client_secret:必须参数,应用的Secret Key;
- scope:非必须参数。以空格分隔的权限列表,若不传递此参数,代表请求的数据访问操作权限与上次获取Access Token时一致。通过Refresh Token刷新Access Token时所要求的scope权限范围必须小于等于上次获取Access Token时授予的权限范围。关于权限的具体信息请参考“权限列表”。
例如:
https://openapi.baidu.com/oauth/2.0/token?
grant_type=refresh_token&
refresh_token=2.e8b7dbabc28f731035f771b8d15063f23.5184000.1292922000-2346678-124328&
client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&
scope=email
响应数据包格式
若参数无误,服务器将返回一段JSON文本,包含以下参数:
-
- access_token:要获取的Access Token;
- expires_in:Access Token的有效期,以秒为单位;请参考“Access Token生命周期”
- refresh_token:用于刷新Access Token 的 Refresh Token,并不是所有应用都会返回该参数;(10年的有效期)
- scope:Access Token最终的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限),关于权限的具体信息参考“权限列表”;
- session_key:基于http调用Open API时所需要的Session Key,其有效期与Access Token一致;
- session_secret:基于http调用Open API时计算参数签名用的签名密钥。
例如:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
"expires_in": 86400,
"refresh_token": "2.af3d55f8615fdfd9edb7c4b5ebdc3e32.604800.1293440400-2346678-124328",
"scope": "basic email",
"session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn",
"session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
}
若请求错误,服务器将返回一段JSON文本,包含以下参数:
-
- error:错误码;关于错误码的详细信息请参考“百度OAuth2.0错误响应”一节。
- error_description:错误描述信息,用来帮助理解和解决发生的错误。
例如:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"
}
权限列表
用户授权相关的权限 | 描述 |
---|---|
basic | 用户基本权限,可以获取用户的基本信息 |
super_msg | 往用户的百度首页上发送消息提醒,相关API任何应用都能使用,但要想将消息提醒在百度首页显示,需要第三方在注册应用时额外填写相关信息 |
netdisk | 获取用户在个人云存储中存放的数据 |
平台授权相关的权限 | 描述 |
public | 可以访问公共的Open API |
hao123 | 可以访问Hao123 提供的Open API接口 该权限需要申请开通,请将具体的理由和用途发邮件给tuangou@baidu.com。 |
每一个Access Token代表“一个用户”或“百度开放平台”授予“一个应用”的“一系列数据访问操作权限”。这“一系列数据访问操作权限”中包含默认访问权限,以及在获取Access Token过程中传递的“scope”参数所表示的扩展权限。在调用API时,百度Open API服务会检验请求中的Access Token或Session Key是否包含本API需要的权限。
应用在请求获取Access Token时所传递的“scope”参数中可以不包含basic权限(即默认权限),一旦用户或平台同意授权,则basic权限会自动授予。百度目前开放的Open API还为数不多,目前唯一定义的扩展权限就super_msg访问权限,应用需要这个权限时需要在获取Access Token时指定scope=super_msg,如:
https://openapi.baidu.com/oauth/2.0/authorize?
response_type=code&
client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect&
scope=super_msg&
display=popup
获取Access Token示例
下面操作步骤以Android SDK为例介绍如何在您的应用程序中获取Access Token。
1. 开发者预先配置好Android开发环境。
请参考http://developer.android.com/index.html
请您下载Android SDK:BaiduPCS_SDK_Android_2.0.zip
2. 从下载包中的BaiduPCS_SDK_Android_2.0\lib目录中得到所有的Jar包:
3. 在Eclipse创建一个Android应用程序。
4. 修改AndroidManifest.xml,增加以下权限:
5. 修改layout/main.xml,向其中添加button widget:
6. 进入项目libs目录,然后将下载的包中的PcsAndroidDemo/libs中的Baidu_OAuth_SDK_Android_G-2.0.0.0.jar包拷贝到此libs目录,然后并将其加入Android程序的Build Path中。
![pcs_100.jpg](http://developer.baidu.com/wiki/static/PCS/pcs_100.jpg)
7. 修改工程中默认的MainActivity.java。
1) Import 库
2) 设定用户API key
3) 添加按钮响应事件。
8. 运行Android程序,登录并进行授权:
![pcs_101.jpg](http://developer.baidu.com/wiki/static/PCS/pcs_101.jpg)
输入已有的百度用户名和密码,单击登录。
右上方蓝色字体“pcstest_oauth”是用户申请第三方应用时指定的应用名(和上面替换的API key有对应关系)。
如果用户第一次登录第三方应用,会出现授权页面,用户需要单击“授权”:
![pcs_102.jpg](http://developer.baidu.com/wiki/static/PCS/pcs_102.jpg)
9. 授权成功后,在Android模拟器toast消息框里面我们就能看见获取的access token信息和用户名。使用此Access Token,第三方开发者就可以使用PCS API了。
![pcs_103.jpg](http://developer.baidu.com/wiki/static/PCS/pcs_103.jpg)