开发文档

优质
小牛编辑
150浏览
2023-12-01

1. 概述

如果百度用户访问第三方应用网页,则第三方应用可以通过网页授权机制,来获取百度用户基本信息,进而实现自身业务功能。

具体而言,百度帐号网页授权流程分为四步:

  1. 引导用户进入授权页面同意授权,获取code;

  2. 通过code换取网页授权access_token;

  3. 如果需要,开发者可以刷新网页授权access_token,避免过期;

  4. 通过网页授权access_token获取用户基本信息。

2. 引导用户完成授权获取code

开发时,需要将用户浏览器重定向到如下URL地址。

接口调用请求说明:

GET https://openapi.baidu.com/oauth/2.0/authorize?response_type=CODE&client_id=API_KEY&redirect_uri=REDIRECT_URI&scope=SCOPE&state=STATE

参数说明:

参数名类型是否必须描述
response_typestring固定为 code。
client_idstring注册应用时获得的API Key。
string授权后要回调的URI,即接收Authorization Code的URI。如果用户在授权过程中取消授权,会回调该URI,并在URI末尾附上error=access_denied参数。对于无Web Server的应用,其值可以是“oob”,此时用户同意授权后,授权服务会将Authorization Code直接显示在响应页面的页面中及页面title中。非“oob”值的redirect_uri按照如下规则进行匹配:(1)如果开发者在“授权安全设置”中配置了“授权回调地址”,则redirect_uri必须与“授权回调地址”中的某一个相匹配; (2)如果未配置“授权回调地址”,redirect_uri所在域名必须与开发者注册应用时所提供的网站根域名列表或应用的站点地址(如果根域名列表没填写)的域名相匹配。授权回调地址配置请参考附录Ⅰ-1
scopestring以空格分隔的权限列表,若不传递此参数,代表请求用户的默认权限。可填basic或mobile。
displaystring登录和授权页面的展现样式,默认为“page”,具体参数定义请参考附录Ⅰ-2
statestring重定向后会带上state参数。建议开发者利用state参数来防止CSRF攻击。
force_loginint如传递“force_login=1”,则加载登录页时强制用户输入用户名和口令,不会从cookie中读取百度用户的登陆状态。
confirm_loginint如传递“confirm_login=1”且百度用户已处于登陆状态,会提示是否使用已当前登陆用户对应用授权。
login_typestring如传递“login_type=sms”,授权页面会默认使用短信动态密码注册登陆方式。
qrext_clientidstring网盘扫码透传字段
bgurlstring二维码登录方式的背景图片url链接,需要encode
qrcodeWint自定义二维码图片的宽度
qrcodeHint自定义二维码图片的高度
qrcodeint如传递“qrcode=1”,登录授权页面将增加扫码登录入口;注:扫码登录入口点击跳转至二维码页面,目前支持PC、TV、音箱、watch、kindle
qrloginfromstring扫码登录被扫码端设备类型;目前传参仅支持:pc、tv、speakers、watch、kindle;注:speakers为音箱的标志;说明:此配置仅支持display=tv时;
userRegint如传递“qrcode=1”,扫码登录页配置“用户名登录”、“注册”入口;说明:此配置仅支持display=tv时;
appTipstring扫码登录页二维码底部提示文案,中文文案需encodeURIComponent('提示文案');说明:此配置仅支持display=tv时;
appNamestring扫码登录页二维码底部app文案配置,中文文案需encodeURIComponent('网盘App');说明:此配置仅支持display=tv时;

下图为登录授权页面:

无scope权限或redirect_uri不合法时,会展示错误页面,并提示出错原因,如下图示:

用户同意授权后:页面将跳转至redirect_uri/?code=CODE&state=STATE。

code说明:code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,10分钟未被使用自动过期。

3. code获取授权access_token

redirect_uri指定的开发者服务器地址,在获取到授权code参数后,从服务端向百度开放平台发起如下HTTP请求,通过code换取网页授权access_token。

注意:access_token长度保留256字符。

接口调用请求说明:

GET https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=CODE&client_id=AP I_KEY&client_secret=SECRET_KEY&redirect_uri=REDIRECT_URI    

参数说明:

参数名类型是否必须描述
grant_typestring固定为authorization_code
codestring用户授权后得到code
client_idstring应用的API Key
client_secretstring应用的Secret Key
redirect_uristring该值必须与获取Authorization Code时传递的“redirect_uri”保持一致。

返回值说明:

字段名类型描述
access_tokenstring获取到的网页授权接口调用凭证
expires_inintAccess Token的有效期,以秒为单位
refresh_tokenstring用于刷新Access Token的Refresh Token,所有应用都会返回该参数**(10年的有效期**)
scopestringAccess Token最终的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限)
session_keystring基于http调用Open API时所需要的Session Key,其有效期与Access Token一致
session_secretstring基于http调用Open API时计算参数签名用的签名密钥

错误情况下:

字段名类型描述
errorstring错误码,关于错误码的详细信息请参考附录Ⅰ-3
error_descriptionstring错误描述信息,用来帮助理解和解决发生的错误

返回值示例:

{  
     "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"  
} 

出错时返回:

{  
     "error":  "invalid_grant",  
     "error_description":  "Invalid  authorization  code:  ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"   
} 

4. 按需刷新access_token

当access_token过期后,可以使用refresh_token进行刷新。refresh_token有效期为十年。

接口调用请求说明:

GET https://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token=REFRESH_TOKEN &client_id=API_KEY&client_secret=SECRET_KEY 

参数说明:

参数名类型是否必须描述
grant_typestring固定为refresh_token
refresh_tokenstring通过access_token获取到的refresh_token参数
client_idstring应用的API Key
client_secretstring应用的Secret Key

返回值说明:

字段名类型描述
access_tokenstring获取到的网页授权接口调用凭证
expires_inintAccess Token的有效期,以秒为单位
refresh_tokenstring用于刷新Access Token的Refresh Token,所有应用都会返回该参数(10年的有效期
scopestringAccess Token最终的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限)
session_keystring基于http调用OpenAPI时所需要的Session Key,其有效期与 Access Token一致
session_secretstring基于http调用OpenAPI时计算参数签名用的签名密钥。

错误情况下:

字段名类型描述
errorstring错误码,关于错误码的详细信息请参考附录Ⅰ-3
error_descriptionstring错误描述信息,用来帮助理解和解决发生的错误

返回值示例:

{  
     "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"  
} 

出错时返回:

{
     "error": "expired_token",
     "error_description": "refresh token has been used"
}

5. 获取授权用户信息

获取access_token之后,开发者可以通过access_token拉取用户信息。

接口调用请求说明:

GET https://openapi.baidu.com/rest/2.0/passport/users/getInfo?access_token=access_token 

参数说明:

参数名类型是否必须描述
access_tokenstring由上述步骤获取的OpenAPI接口调用凭证
get_unionidint需要获取unionid时,传递get_unionid = 1

返回参数:

参数名参数类型是否必需示例值描述
openidstringoPXyY4O0ZTmUqSX4MRxYDDCccT6Kc9E百度用户的唯一标识,对当前开发者帐号、当前应用唯一
unionidstringuA91qQ6gAISTuy0mMqoeh7lZ0w6x478百度用户统一标识,对当前开发者帐号唯一
useriduint67411167老版 百度用户的唯一标识,后续不在返回该字段
securemobileuint188888888当前用户绑定手机号(需要向开放平台申请权限)
usernamestringt***e当前登录用户的展示用户名,包含打码"*"号
portraitstringe2c1776c31393837313031319605当前登录用户的头像
userdetailstring喜欢自由自我简介,可能为空。
birthdaystring1987-01-010000-00-00为未知生日,以yyyy-mm-dd格式显示。
marriagestring0:未知,1:单身,2:已婚3:恋爱4:离异婚姻状况
sexstring0:未知,1:男,2:女性别
bloodstring0:未知,1:A,2:B,3:O,4:AB,5:其他血型
is_bind_mobileuint0:未绑定,1:已绑定是否绑定手机号
is_realnameuint0:未实名制,1:已实名制是否实名制

错误情况下:

字段名类型描述
error_codeint错误码
error_msgstring错误描述信息,用来帮助理解和解决发生的错误

关于错误码的详细信息请参考附录Ⅰ-5.4

返回值示例:

{    
     "openid": "oPXyY4O0ZTmUqSX4MRxYDDCccT6Kc9E",
     "unionid": "uA91qQ6gAISTuy0mMqoeh7lZ0w6x478",
     "userid": "2097322476",
     "username": "u***9",
     "userdetail": "喜欢自由", 
     "birthday": "1987-01-01",
     "marriage": "0",
     "sex": "1",
     "blood": "3",
     "is_bind_mobile": "1",
     "is_realname": "1" 
}

出错时返回:

{  
     "error_code": "100",  
     "error_msg": "Invalid parameter"   
}