目前,百度OAuth2.0支持五种获取Access Token的流程和一种刷新获取AccessToken方式,第三方可根据需求选取合适的方式:javascript
百度受权的Access Token是有有效期的,这样会影响用户的体验和增长开发者的工做。因此平台提供了一种方式能够保证受权有效期为永久。php
获取途径 | 受权流程 | 介绍 | 有效期 |
---|---|---|---|
新获取 | 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端配合的应用 。 | 十年刷新期限。 |
请求用户受权时百度提供了一个在OAuth2.0协议中没有提到的参数:display。它是用来标识不一样形式的客户端所对应的不一样展示形式的受权页面,其值定义以下:java
|
为确保验证受权过程的安全,开发者必须在开发者中心预先注册应用所在的域名或URL,用以OAuth2.0检验受权请求中的“redirect_uri”参数。以便保证OAuth2.0在回调过程当中,会回调到安全域名。web
开发者在开发者中心的安全设置中填写了受权回调地址(支持至多十个受权回调地址)。数据库
平台提供了一种默认的redirect uri参数为 "oob",回调后会返回一个平台提供默认回调地址(http://openapi.baidu.com/oauth/2.0/login_success )。json
用户受权相关的权限 | 描述 |
---|---|
basic | 用户基本权限,能够获取用户的基本信息 |
super_msg | 往用户的百度首页上发送消息提醒,相关API任何应用都能使用,但要想将消息提醒在百度首页显示,须要第三方在注册应用时额外填写相关信息 |
netdisk | 获取用户在我的云存储中存放的数据 |
平台受权相关的权限 | 描述 |
public | 能够访问公共的Open API |
hao123 | 能够访问Hao123 提供的Open API接口 |
每个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,如:api
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
第三方Web网站接入百度,主要有两种技术方案:跨域
采用Authorization Code获取Access Token的受权验证流程又被称为Web Server Flow,适用于全部有Server端的应用,如Web/Wap站点、有Server端的手机/桌面客户端应用等。其流程示意图以下:浏览器
对于应用而言,其流程由如下两步组成:
(1)获取Authorization Code
(2)经过Authorization Code获取Access Token
1.1 获取Authorization Code
请求数据包格式:
其获取方式是经过重定向用户浏览器(或手机/桌面应用中的浏览器组件)到“https://openapi.baidu.com/oauth/2.0/authorize”地址上,并带上如下参数:
|
例如:“client_id”为“Va5yQRHlA4Fq4eR3LT0vuXV4”的应用要请求某个用户的默认权限和email访问权限,并在受权后需跳转到“http://www.example.com/oauth_redirect”,同时但愿在弹出窗口中展示用户登陆、受权界面,则应用须要重定向用户的浏览器到以下URL:
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=email& display=popup
响应数据包格式:
此时受权服务会根据应用传递参数的不一样,为用户展示不一样的受权页面。若是用户在此页面赞成受权,受权服务则将重定向用户浏览器到应用所指定的“redirect_uri”,并附带上表示受权服务所分配的Authorization Code的code参数,以及state参数(若是请求authorization code时带了这个参数)。
例如:继续上面的例子,假设受权服务在用户赞成受权后生成的Authorization Code为“ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn”,则受权服务将会返回以下响应包以重定向用户浏览器到“http://www.example.com/oauth_redirect”地址上:
HTTP/1.1 302 Found Location: http://www.example.com/oauth_redirect?code=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn
“code”参数能够在“redirect_uri”对应的应用后端程序中获取。 注意:每个Authorization Code的有效期为10分钟,而且只能使用一次,再次使用将无效。
经过上面第一步得到Authorization Code后,即可以用其换取一个Access Token。获取方式是,应用在其服务端程序中发送请求(推荐使用POST)到 百度OAuth2.0受权服务的“https://openapi.baidu.com/oauth/2.0/token”地址上,并带上如下5个必须参数:
|
例如:
https://openapi.baidu.com/oauth/2.0/token? grant_type=authorization_code& code=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn& client_id=Va5yQRHlA4Fq4eR3LT0vuXV4& client_secret=0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2& redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect
响应数据包格式
若参数无误,服务器将返回一段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": "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" }
经过HTTPS协议发送开放API调用请求时只须要在请求API对应的URL地址时,经过GET参数或POST参数传递具体开放API接口的业务级参数及下表中的几个系统级参数:
参数名 | 参数类型 | 是否必需 | 描述 |
---|---|---|---|
access_token | string | 是 | OAuth2.0验证受权后得到的token。 |
callback | string | 否 | 第三方经过JS调用开放API时能够经过指定callback参数来要求平台端返回JSONP代码,以解决跨域问题。 |
假设应用经过OAuth2.0协议获取Access Token时,受权服务器返回的JSON内容为:
{ "access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328", "expires_in": 86400, "refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328", "scope": "basic email", "session_key": "9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A=", "session_secret": "27e1be4fdcaa83d7f61c489994ff6ed6", }
当前系统时间为2011-06-21 17:18:09,要求以json格式返回API调用结果,则应用既能够经过GET方法发送以下请求包来调用获取当前登陆用户的基本资料的开放API接口:
GET https://openapi.baidu.com/rest/2.0/passport/users/getInfo?access_token=1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328 HTTP/1.1 Host: openapi.baidu.com User-Agent: Client of Baidu Open Platform Accept: */* Accept-Encoding: gzip,deflate Accept-Charset: utf-8 Connection: close
也能够经过POST方法发送以下请求包,来获取开放API调用的响应结果。
POST https://openapi.baidu.com/rest/2.0/passport/users/getInfo HTTP/1.1 Host: openapi.baidu.com User-Agent: Client of Baidu Open Platform Accept: */* Accept-Encoding: gzip,deflate Accept-Charset: utf-8 Content-Length: 91 Connection: close access_token=1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328
因为每一个API调用都是经过发送HTTP请求或HTTPS来完成的,所以都有可能由于发送的参数不合法、发送频率过快次数过多、平台REST服务自身出问题等缘由而致使API调用失败,此时百度REST服务器将按照format参数所指定的响应格式返回相应错误信息,包含以下参数:
|
(百度API列表见 http://developer.baidu.com/wiki/index.php?title=docs/oauth/rest/file_data_apis_list)
以调用获取当前登陆用户基本资料的API接口为例,假设经过https请求发送API调用请求时所传递的access_token已通过期。 则将返回以下格式的错误信息:
{ "error_code": "110", "error_msg": "Access token invalid or no longer valid", }
(参考:http://developer.baidu.com/wiki/index.php?title=%E7%99%BE%E5%BA%A6Open_API%E9%94%99%E8%AF%AF%E7%A0%81%E5%AE%9A%E4%B9%89)
Error Code | Error Description(Chinese) | Error Description(English) |
---|---|---|
0 | 成功 | Success |
1 | 未知错误 | Unknown error |
2 | 服务暂不可用 | Service temporarily unavailable |
3 | 未知的方法 | Unsupported openapi method |
4 | 接口调用次数已达到设定的上限 | Open api request limit reached |
5 | 请求来自未经受权的IP地址 | Unauthorized client IP address:%s |
6 | 无权限访问该用户数据 | No permission to access data |
7 | 来自该refer的请求无访问权限 | No permission to access data for this referer |
100 | 请求参数无效 | Invalid parameter |
101 | api key无效 | Invalid API key |
102 | session key无效 | Session key invalid or no longer valid |
103 | call_id参数无效 | Invalid/Used call_id parameter |
104 | 无效签名 | Incorrect signature |
105 | 请求参数过多 | Too many parameters |
106 | 未知的签名方法 | Unsupported signature method |
107 | timestamp参数无效 | Invalid/Used timestamp parameter |
108 | 无效的user id | Invalid user id |
109 | 无效的用户资料字段名 | Invalid user info field |
110 | 无效的access token | Access token invalid or no longer valid |
111 | access token过时 | Access token expired |
112 | session key过时 | Session key expired |
114 | 无效的ip参数 | Invalid Ip |
210 | 用户不可见 | User not visible |
211 | 获取未受权的字段 | Unsupported permission |
212 | 没有权限获取用户的email | No permission to access user email |
800 | 未知的存储操做错误 | Unknown data store API error |
801 | 无效的操做方法 | Invalid operation |
802 | 数据存储空间已超过设定的上限 | Data store allowable quota was exceeded |
803 | 指定的对象不存在 | Specified object cannot be found |
804 | 指定的对象已存在 | Specified object already exists |
805 | 数据库操做出错,请重试 | A database error occurred. Please try again |
900 | 访问的应用不存在 | No such application exists |
950 | 批量操做已开始,请先调用end_batch接口结束前一个批量操做 | begin_batch already called, please make sure to call end_batch first |
951 | 结束批量操做的接口调用不该该在start_batch接口以前被调用 | end_batch called before start_batch |
952 | 每一个批量调用不能包含多于20个接口调用 | Each batch API can not contain more than 20 items |
953 | 该接口不适合在批量调用操做中被使用 | Method is not allowed in batch mode |
参考文档:http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E7%99%BE%E5%BA%A6%E5%B8%90%E5%8F%B7%E8%BF%9E%E6%8E%A5