负责的一个项目中使用到了一个Oauth2协议的实现,不过可惜我只负责前端部分,所以后台程序具体是怎样运行的并不清晰,现在根据一些我的理解来谈一下怎么实现一个简单的第三方授权,希望以后能够用到自己的项目中。
引子:(摘自百度百科)
如果一个用户拥有两项服务:A.图片在线存储服务;B.图片在线打印服务。如果服务A和服务B是由两家不同的服务提供商提供的,那么用户在两家服务提供商的网站上各自注册了用户账号。当用户要使用服务B打印存储在服务A上的图片时,用户该怎么处理?1.从服务A处下载图片,上传到服务B并打印,这种方式安全但处理繁琐,效率低下;2.用户将在服务A上的用户账号密码告诉服务B,由服务B代用户去获取图片并进行打印,这种方式显得高效,但安全性大大降低,相当于服务B能够获取用户在服务A上的权限,甚至篡改资料。
云计算时代,越来越需要避免方式1一样繁琐的操作,但又不能使用方式2一样安全性为零的处理,所以出现了第三方授权的协议,Oauth就是其中之一。现在我们都经常接触到第三方登录的应用。现在网站、应用那么多,若全部都使用各自一套的账号密码,那该多麻烦的事啊,所以以腾讯、新浪为首的掌握大量用户账号的公司逐渐开放第三方登录功能,极大地省去了用户多次创建用户账号的过程。
角色:用户,服务A,服务B
前提:服务A运行着第三方授权程序,等待请求;服务B事先与服务A沟通协商好,拥有服务A第三方授权的信息;用户需要使用服务A的账号来登录服务B
1.服务B为用户提供一个服务A第三方登录的url链接,当用户点击链接时,页面跳转到服务A的专门授权页面。因为url是B生成的,所以B可以在里面添加与服务A已协商好的信息,主要向A表明向哪个服务商授权。
2.当A接收到请求时,先验证一下服务商B的信息,如果存在合作关系(信息匹配),则显示自己的登录页面验证用户的身份,如果不匹配,应当reject。
3.用户在页面上输入用户账号密码信息,并向A发送认证请求,A验证完成之后,向用户发送一个grant code,并提醒用户是否授权给B。
4.如果用户选择授权,点击url后,将grant code提交给A来换取token。此时A收到授权请求,需要与B互动。A发送关于这次授权的token给B(token1),利用重定向使B发送token给用户(token2)。
5.有了token2,用户就可以像其他用户一样登录服务B,而服务B拿取token1就可以获取用户在服务A上的数据,比如用户名、头像、年龄、签名,图片等。
当然上面是很简单的应用,实际上服务A和服务B都可以在这个基础做很多事情,比如控制好token1的权限,不让它获取重要信息;服务B获得授权好,强制/自动为用户在本地创建账号等,全凭你怎么协商与实现。
-------------------------------本文为本人学习总结,有疑问请指出-------------------------------