Implicit Grant授权
简介
采用Implicit Grant方式获取Access Token的授权验证流程又被称为User-Agent Flow,适用于所有无Server端配合的应用(由于应用往往位于一个User Agent里,如浏览器里面,因此这类应用在某些平台下又被称为Client-Side Application),如手机/桌面客户端程序、浏览器插件等,以及基于JavaScript等脚本客户端脚本语言实现的应用,他们的一个共同特点是,应用无法妥善保管其应用密钥(App Secret Key),如果采取Authorization Code模式,则会存在泄漏其应用密钥的可能性。其流程示意图如下:

对于应用而言,其流程只有一步,即直接获取Access Token。
获取Access Token
请求数据包格式
为了获取Access Token,应用需要将用户浏览器(或手机/桌面应用中的浏览器组件)到百度OAuth2.0授权服务的“http://openapi.baidu.com/oauth/2.0/authorize”地址上,并带上以下参数:
- client_id:必须参数。注册应用时获得的API Key。
- response_type:必须参数。此值固定为“token”。
- redirect_uri:必须参数。授权后要回调的URI,即接受Access Token的URI。如果用户在授权过程中取消授权,会回调该URI,并在URI末尾附上error=access_denied参数。对于无Web Server的应用,其值可以是“oob”,授权后会回调OAuth提供的一个默认页面。如果redirect_uri不为"oob",则redirect_uri指向的页面必须与开发者在“OAuth安全设置”中所填写的"授权回调地址"相匹配。请参考“授权回调地址配置”进行注册。
- scope:非必须参数。以空格分隔的用户权限列表,若不传递此参数,代表请求用户的默认权限。关于权限的具体信息请参考“权限列表”。
- state:非必须参数。用于保持请求和回调的状态,授权服务器在回调时(重定向用户浏览器到“redirect_uri”时),会在Fragment中原样回传该参数。
- display:非必须参数。登录和授权页面的展现样式,默认为“page”,具体参数定义可以参考“自定义授权页面样式”一节。
- force_login:非必须参数,如传递“force_login=1”,则加载登录页时强制用户输入用户名和口令,不会从cookie中读取百度用户的登陆状态。
- confirm_login:非必须参数,如传递“confirm_login=1”且百度用户已处于登陆状态,会提示是否使用已当前登陆用户对应用授权。
- login_type:非必须参数,如传递“login_type=sms”,授权页面会默认使用短信动态密码登陆注册方式。
为了加强安全性,会对跳转到该授权页面的Referer进行检测,要求Referer必须与开发者创建应用时注册的"网站地址"或者在“OAuth安全设置”中所填写的"根域名绑定"同域。
例如:“client_id”为“Va5yQRHlA4Fq4eR3LT0vuXV4”的应用要请求某个用户的默认权限和email访问权限,并在授权后需跳转到“http://www.example.com/oauth_redirect”,同时希望在弹出窗口中展现用户登录授权界面,则应用需要重定向用户浏览器到如下URL:
https://openapi.baidu.com/oauth/2.0/authorize? response_type=token& client_id=Va5yQRHlA4Fq4eR3LT0vuXV4& redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect& scope=email& display=popup& state=xxx
响应数据包格式
若用户登录并接受授权,授权服务将重定向用户浏览器到“redirect_uri”。如果开发者传递的"redirect_uri"为"oob",浏览器将被重定向到OAuth默认提供的一个页面"http://openapi.baidu.com/oauth/2.0/login_success"。并在Fragment中追加如下参数:
- access_token:要获取的Access Token;
- expires_in:Access Token的有效期,以秒为单位;请参考“Access Token生命周期”
- scope:Access Token最终的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限),关于权限的具体信息参考“权限列表”;
- state:如果请求获取Access Token时带有state参数,则将该参数原样返回。
- session_key:基于http调用Open API时所需要的Session Key,其有效期与Access Token一致;
- session_secret:基于http调用Open API时计算参数签名用的签名密钥。
例如:
HTTP/1.1 302 Found Location: http://www.example.com/oauth_redirect#access_token=1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328&expires_in=86400&scope=basic%20email&session_key=ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn&session_secret=248APxvxjCZ0VEC43EYrvxqaK4oZExMB&state=xxx
若请求错误或用户拒绝授权,授权服务将重定向用户浏览器到“redirect_uri”,并在Fragment中追加如下参数:
- error:错误码;关于错误码的详细信息请参考“百度OAuth2.0错误响应”。
- error_description:错误描述信息,用来帮助理解和解决发生的错误;
- state:如果请求获取Access Token时带有state参数,则将该参数原样返回。
例如:
HTTP/1.1 302 Found Location: http://www.example.com/oauth_redirect#error=access_denied&error_description=user%20didnot%20allow%20your%20authorization%20request&state=xxx
开发者需要注意的事项
- 采用Implicit Grant方式获取Access Token时,不会返回Refresh Token。
- 获取Access Token时所返回的session_key和session_secret参数不是OAuth2.0协议标准规定的返回参数,而是百度OAuth2.0服务扩展加入的,目的是使得开发者可以基于http调用百度的Open API,因为基于https调用Open API虽然更为简单,但毕竟响应速度更差(比基于http的要差一倍时间左右)。
- 为了保证安全性,建议应用从授权回调地址接收到Access Token之后,调用Access Token验证接口 判断该Access Token是否对应自身的Api Key。