OAuth原理

less than 1 minute read

OAuth原理比较简单,花时间看了一下它的Spec 1.0a整理的笔记。把基本的原理整理一下。

简单地讲,OAuth解决的问题就是:我在网站A有帐号密码和一些需要登录才能访问的数据,我想让网站B访问这些数据,但是我不想把密码告诉网站B。解决方案就是:给B另外一个密码。

基本精神就是这么简单,剩下的只是一些细节的问题,例如怎样确认这的确是用户的授权,通讯中如何保密等问题。

解决方案展开一点讲,就是:网站A要问一下用户:你是否同意给网站B授权访问你的数据?如果你回答“是”,那网站A就分配给网站B一个帐号密码,网站B就可以用这个帐号密码代表用户访问网站A上面这个用户的数据。

详细的资料在上面说的Spec讲得比较清楚,这里不重复,Spec的内容并不长。这里简单讲讲授权的过程。讲过程前先明确几个概念:

  • 服务提供方(Service Provider):用户使用了这里的服务,在这里有帐号密码,还有其它数据的地方。就是上面说的网站A;
  • 消费者(Consumer): 另一方,就是上面说的网站B。他需要访问服务提供方(网站A)上面的用户数据;
  • 用户(User):就是用户啦(^_^),指个人。

把名词套进去,就是:消费者希望以后能自动代表用户访问用户在服务提供方上的数据,在这之前,需要用户向服务提供方作一个授权。服务提供方验证这个授权之后,以后就可以像消费者提供这个用户的数据。这个要求授权的过程就是OAuth要做的事。

步骤:

  1. 消费者的开发人员阅读服务提供方的有关文档。在服务提供方上面注册自己的信息,获得一个消费者ID和消费者密码。注册的信息可能会被用于服务提供方审核,也可能被展现到将来的授权页面上;而消费者ID和消费者密码则用于消费者和服务提供方的程序通讯用,用于说明这个请求是哪个消费者发来的;
  2. 用户在消费者的网站上浏览,触发了需要访问服务提供方上数据的事件,例如按了一个按钮。消费者的服务器向服务提供方的服务发送请求(请求时带上自己的消费者ID和密码),获得一个未授权的请求标识(oauth_token)。这个未授权请求标识返回到用户手里的时候,会被作为参数值,重定向到服务提供方的网站;
  3. 用户此时来到服务提供方的网站。服务提供方接收到未授权请求标识这个参数,会验证一下。因为这个标识就是服务提供方在第二步生成的,因此它必定可以识别出这是属于哪个消费者的。另外服务提供方会看看用户的状态是否已登录,如果未登录则提示登录。登录验证OK之后,服务提供方展示消费者的信息和需要授予的权限,让用户选择授权还是拒绝;
  4. 用户选择授权之后,服务提供方会生成一个校验码。既可以自动重定向把校验码告诉消费者(目标URL在注册时已经提供了),在不能这样做的情况下也可以显示校验码让用户记下来另行输入。总之是要将校验码通知消费者的一方;
  5. 消费者收到校验码之后,连同刚才的未授权请求标识,用户ID,消费者ID以及消费者密码等等信息组合在一起,发给服务提供方指定的URL;
  6. 服务提供方收到这堆参数之后,分别校验:未授权访问标识未被请求过(避免被拦截重用)、标识码正确、用户ID匹配、请求的签名信息正确。都通过之后,就会生成Access Token and Token Secret,返回给消费者。消费者要把它记下来,以后就是用这个两个参数代表用户访问这个用户在服务提供方上的数据。
  7. 只有用户没有在服务提供方上撤销这个授权,而这授权没有过期的话,就可以一直使用。

搞得比原来想象中复杂了一点。主要是因为考虑到网络传输的过程中可能会被窃听拦截,多种访问方式(不一定通过浏览器),以及在用户体验上的妥协(例如用户可以先按了要求授权再在服务提供方的网站上登录)等。

Categories: 技术

Updated: