Baidu云平台采用OAuth2.0开放授权标准,第三方应用无需获取用户的账号和密码即可访问用户在服务端存储的私有数据。其中较为常用的是Authorization Code授权模式。在实际开发Baidu云平台应用的过程中,可以体会到OAuth2.0的设计理念。
首先需要创建一个应用。在服务端看来,应用是发出API调用的主体,无论具体是从哪个进程哪个IP发出API调用,只要是以同一个应用的名义发出,服务端就不区别对待。具体来讲,一个应用的身份验证信息包括一组client_id和client_secret,相当于这个应用作为一个用户的账户和密码。
服务端通常提供多组功能不同的API。在使用某组API之前,某应用A必须申请这组API的调用权限(实际申请时通常要说明使用频率等信息,以供服务端进行审核)。审核通过后,应用A获取这组API的调用权限。这时以应用A的名义发出的对这组API的调用请求,服务端才会受理。
进一步,当应用A需要访问某个用户B存储在服务端的私有数据时,还需要用户B的授权。具体来讲,应用A会引导用户B访问一个位于服务端的URL,这个URL是一个授权页面。由于URL中附带了应用A的client_id参数,则用户B看到的页面就包含申请授权的应用A的身份信息。在页面中,用户B需要输入账户密码进行授权(Login & Authorization)。由于这个页面位于服务端,因此用户B的账户密码并不经过应用A。
用户B授权之后,服务端会生成一个authorization code,通常通过重定向用户浏览器的方式将这个code交给应用A。应用A可以使用code从服务端换取一个access token,至此授权结束。之后,应用只需在每次调用API时附加这个token即可(具体可以放在URL参数或HTTP header)。
从授权流程中可以发现,这个access token唯一对应了一个应用和一个用户。一个token对应一个应用的意义是,服务端可以根据API调用中附加的token判断发出API调用的是哪个应用,进而判断这个应用是否有对这个API的调用权限。一个token对应一个用户的意义是,服务端可以判断这次API调用要访问的是哪个用户的数据。一个token对应一个应用加一个用户的意义是,服务端可以判断这次API调用是否具有对该用户私有数据的访问权限。因此,在生成access token之后,只需在API调用中附加token就确认了一次API调用中的三个重要信息,主体(应用身份,API调用权限),客体(用户身份,被访问的数据),关系(访问权限)。