Client Credentials授权
简介
采用Client Credentials方式,即应用公钥、密钥方式获取Access Token,适用于任何类型应用,但通过它所获取的Access Token只能用于访问与用户无关的Open API,并且需要开发者提前向百度开放平台申请,成功对接后方能使用。其流程示意图如下:

对于应用而言,其流程只有一步,即直接获取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的要差一倍时间左右)。