(要使用一个开发者账号创建一个应用,这样,每个应用都对应一个开发者作为负责人。)
在服务端看来,发出 API 调用的主体是一个应用,无论具体是从哪个进程哪个 IP 发出调用,只要是以个同一个应用的名义发出的,服务端就不区别对待。具体来讲,应用的身份验证信息包括一组 client_id 和 client_secret。开发者可以为某个应用申请某个 API 的调用权限,只有在这个应用获取这个 API 的调用权限之后,以这个应用的名义发出的对这个 API 的调用请求服务端才会受理。
进一步,当需要在成功调用的 API 中访问某个用户的私有数据时,还需要用户对这次访问的授权。由于在服务端看来发出调用的是一个应用,因此需要用户对这个应用进行授权。具体来讲,在重定向用户浏览器到服务端 host 的认证页面时,这个 URL 包含 client_id 参数,这样服务端就能在页面中呈现应用的身份信息,而用户就能知道申请访问权限的是哪个应用。
在成功授权之后,会生成一个 access token,这个 access token 就对应了一个应用和一个用户(之所以能对应到一个用户,是因为用户在授权时输入了自己的账户密码)。一个 token 对应一个应用的作用是,在发出 API 调用时提供这个 token,服务端可以判断发出调用的是哪个应用,进而判断是否有这个 API 的调用权限。一个 token 对应一个用户的作用是,服务端可以判断这次调用的处理对象是哪个用户的数据。一个 token 对应一个应用+一个用户的作用是,服务端可以判断这次调用是否具有数据访问权限。因此,在生成 access token 之后,只需在 API 调用中提供 token 就确认了一次 API 调用中的三个重要信息,(主体:应用身份)API 调用权限,(客体:用户身份)被访问的数据,(关系:该应用对该用户)访问权限。