首页 > 帮助文档首页 > 百度OAuth > Implicit Grant授权

Implicit Grant授权

<sidebar>sidebar:oauth_menu<sidebar>

简介

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

oauth%2Fimplicit.gif

        对于应用而言,其流程只有一步,即直接获取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。

百度统计