auth2.0是一种对第三方授权协议。假设用户的数据存储在服务器server上,第三方应用想要使用用户在server上的数据,一种办法就是用户直接使用sevrer的账号+密码登录第三方,然后第三方就可以直接从server上取数据了。这种做法的坏处在于需要把用户名和密码暴露给第三方,那么首先,第三方是否足够安全值得怀疑,其次第三方本身是否有安全漏洞,再者失去控制,第三方具有了随意使用用户账户的能力。这些都决定了直接使用账号+密码的方式不合理。
由此,衍生出了这里的auth协议。总体思路就是第三方需要server数据时,请求server颁发一个token,只有有了token才能访问。而这个token是否可以颁发取决于用户是否同意授权。token有时限和范围,是可控的。
实际过程并不是直接返回token的,而是第三方先拿到code,再用code申请token。
具体的过程如下:
1.用户点击第三方登录,第三方客户端发送一个请求值server认证服务器。表明自己要申请一个code/token。这里需要提供:
type:授权的方式,一般是code,即授权码模式;
appid:并不是任意的第三方都可以申请server的token,必须在server处预先注册。比如注册要申请哪些服务。毕竟server不可能随便给一个第三方授权;
callback:返回code时的重定向地址。因为发送code之前需要有用户授权的过程,所以这里并不是一个同步调用。最后server返回code时就重定向到这里传的callback回调地址。
2.重定向到第三方的callback地址时,第三方就是用code来向server申请token。这里需要提供:
code:之前申请的code;
callback:申请到token以后的重定向地址;
下面是一个小例子:
本来认证server和第三方应该是两个服务,但是这里为了方便放在了一个web项目的两个包下。
部署到tomcat下,浏览器访问:
这里部署的context为"/",所以不需要项目名。
看到:
点击login by wechat。
之后显示:
这里为了简化,没有加上用户授权的过程。
代码:https://github.com/miracle2138/authExample