(1)什么是Oauth?
Oauth是一个开放的认证协议,让你可以在Web或桌面程序中使用简单而标准的,安全的API认证。
同时,任何第三方都可以使用Oauth认证服务,任何服务提供商都可以实现自身的Oauth认证服务,因而Oauth是开放的。
业界提供了Oauth的多种实现如PHP、JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而Oauth是简易的。
互联网很多服务如Open API,很多大公司如Google,Yahoo,Microsoft等都提供了Oauth认证服务,这些都足以说明Oauth标准逐渐成为开放资源授权的标准。
(2)我们为什么要用Oauth?
网络开放是一个不变的趋势,那么不可避免的会有各种网络服务间分享内容的需要。
举个我们身边例子吧:比如某个公司做了一个应用,想要调用QQ邮箱的联系人列表,现在的方法是你需要在他们应用里输入你的QQ号,QQ密码才能调用,
虽然他们都自谓“不保留QQ用户名和密码”,但是你们相信吗?我们信息已经暴漏给这家公司了,又有谁知道他们到底用没用我们的信息进行一些我们所不允许的事情呢?
OAuth就是为了解决这个问题而诞生的,当我们访问某个公司应用,再调用QQ邮箱的联系人列表,不再提交你的用户名,密码到他们公司而是提交到腾讯公司的服务器。
这样好处自己是安全,而且不会泄露你的隐私给不信任的一方。
再说一个典型案例:
如果一个用户拥有两项服务:一项服务是图片在线存储服务A,另一个是图片在线打印服务B。如
下图所示。由于服务A与服务B是由两家不同的服务提供商提供的,所以用户在这两家服务提供商的网站上各自注册了两个用户,
假设这两个用户名各不相同,密码也各不相同。当用户要使用服务B打印存储在服务A上的图片时,用户该如何处理?
法一:用户可能先将待打印的图片从服务A上下载下来并上传到服务B上打印,这种方式安全但处理比较繁琐,效率低下;
法二:用户将在服务A上注册的用户名与密码提供给服务B,服务B使用用户的帐号再去服务A处下载待打印的图片,这种方式效率是提高了,但是安全性大大降低了,服务B
以使用用户的用户名与密码去服务A上查看甚至篡改用户的资源。
很多公司和个人都尝试解决这类问题,包括Google、Yahoo、Microsoft,这也促使OAUTH项目组的产生。
OAuth是由Blaine Cook、Chris Messina、Larry Halff 及David Recordon共同发起的,目的在于为API访问授权提供一个开放的标准。
(3)Oauth中角色
1.ServiceProvider(服务提供商)
ServiceProvider通常是网站,在这些网站中保存着用户的一些受限制的资源,例如图片共享网站,博客或者微博系统等。
这些网站通常是使用用户名和密码来确认用户的身份。一方面负责验证用户身份,另一方面保存用户信息。
在我们要开发的腾讯微博客户端的服务提供商就是腾讯开放平台。
2.User(用户)
持有登录网站的用户名、密码,并在网站上保存了一些信息,例如照片等.用户不希望把这些私人信息公开,但是用户却需要将这些信息
共享给其他网站。我们有时却希望能够被另一个应用程序访问。
3.Consumer(客户)
希望访问用户私人信息的应用程序,可以是web应用程序,桌面应用程序或者手机应用程序。Consumer需要授权后才能访问相应资源。
我们所开发的应用程序就是Consumer.我们的应用程序是希望能够访问用户的私人信息的,但是我们又不能够得到用户的用户名和密码,那这个中间就有一个
授权的过程。
4.ProtectedResources
被保护的资源。
(4)Oauth验证流程
对于Consumer来讲他无法得到用户的用户名和密码,那他怎么才能得到用户的某些私人信息呢?基本流程如下:
第一步:某个用户想使用我们创造的应用程序。他无法得到用户的用户名和密码,所以不能直接使用用户的信息。
第二步:Consumer就会向Service Provider请求访问用户的资源。
第三步:Service Provider 就会向用户询问是否可以同意Consumer访问用户的资源。
第四步:如果同意,用户就告诉Service Provider向Consumer授权访问。
第五步:Consumer获的授权。
第六步:Consumer就会服务该用户。Consumer就会向Service Provider取得该用户的一些信息,显示给该用户。
(5)Oauth验证过程
第一步:首先是我们的应用程序也就是Consumer向Service Provider请求一个Token(令牌),然后Service Provider会提供我们一个请求令牌。
第二步:将用户的页面定向到一个验证页面,这个页面不是我们Consumer提供的页面,而是由Service Provider提供的,在我们这就是腾讯提供的验证页面。
在这里输入你的用户名和密码来验证你的身份。从这可以看出用户提交的用户名和密码并没有提交给我们编写的Consumer,而是提交给了Service Provider即腾讯。
这样就能保证用户的用户名和密码不会泄露,不会让第三方知道。
第三步:由Service验证用户输入的用户名和密码是否正确,如果正确就提示登陆成功。
第四步:登陆成功之后再把这个页面重定向到我们自己的页面上。Service就会通知Consumer该用户没问题,同时会分配Consumer一个授权过后的令牌。
第五步:Consumer通过这个授权之后的令牌来换取一个访问令牌,得到这个访问令牌之后我们的验证就结束了。
第六步:通过这个访问令牌就可以访问该用户的私人信息了。
从上面的步骤可以看出,用户始终没有将其用户名与密码等信息提供给使用者(第三方软件),从而更安全。