开发者需要根据各自的应用场景,选择适用的OAuth2.0授权流程:
以下介绍了三种应用场景方便开发者熟悉授权流程。
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
Implicit Grant | 又称User-Agent Flow,适用于所有无Server端配合的应用(桌面客户端需要内嵌浏览器)。 | 有效期一个月的Access Token。 |
1. 引导用户到如下地址进行授权:
2. 如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI 在Fragment中追加如下参数。
3. 截获OAuth2.0 Access Token调用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。
OAuth2.0(开放授权)是一个开放标准,用户授权后,第三方应用无需获取用户的用户名和密码就可以访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表)。
Access Token:用户身份验证和授权的凭证。第三方应用在调用百度开放API之前,首先需要获取Access Token。
目前,百度OAuth2.0支持五种获取Access Token的流程和一种刷新获取AccessToken方式,第三方可根据需求选取合适的方式:
百度授权的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方式,即应用公钥、密钥方式获取Access Token,适用于任何类型应用,但通过它所获取的Access Token只能用于访问与用户无关的Open API,并且需要开发者提前向百度开放平台申请,成功对接后方能使用。其流程示意图如下:
对于应用而言,其流程只有一步,即直接获取Access Token。
使用Client Credentials获取Access Token需要应用在其服务端发送请求(推荐用POST方法)到百度OAuth2.0授权服务的“https://openapi.baidu.com/oauth/2.0/token”地址上,并带上以下参数:
例如:
https://openapi.baidu.com/oauth/2.0/token?
grant_type=client_credentials&
client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&
若参数无误,服务器将返回一段JSON文本,包含以下参数:
例如:
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文本,包含以下参数:
例如:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"
}
对于从百度开放平台申请到允许永久授权权限的应用,无论其采用Authorization Code、Reource Owner Password Credentials、Client Credentials中的哪一个去获取Access Token,都会拿到一个有效期为个月的Access Token和有效期为10年的Refresh Token对于这些应用,只要用户在10年内登陆应用,应用就可以使用Refresh Token刷新以获得新的Access Token(新的Refresh Token也会同时下发),从而达到只要用户不连续10年未登陆过你的应用就不需要重新登陆的目的。
使用Refresh Token刷新以获得新的Access Token,需要应用在其服务端发送请求(推荐用POST方法)到百度OAuth2.0授权服务的“https://openapi.baidu.com/oauth/2.0/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文本,包含以下参数:
例如:
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文本,包含以下参数:
例如:
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接口 该权限需要申请开通,请将具体的理由和用途发邮件给[email protected]。 |
每一个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
下面操作步骤以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中。
7. 修改工程中默认的MainActivity.java。
1) Import 库
2) 设定用户API key
3) 添加按钮响应事件。
8. 运行Android程序,登录并进行授权:
输入已有的百度用户名和密码,单击登录。
右上方蓝色字体“pcstest_oauth”是用户申请第三方应用时指定的应用名(和上面替换的API key有对应关系)。
如果用户第一次登录第三方应用,会出现授权页面,用户需要单击“授权”:
9. 授权成功后,在Android模拟器toast消息框里面我们就能看见获取的access token信息和用户名。使用此Access Token,第三方开发者就可以使用PCS API了。