什么是oauth2.0
OAuth简单说就是一种授权的协议,是一种开放的授权标准。允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息。 只要授权方和被授权方遵守这个协议去写代码提供服务,那双方就是实现了OAuth模式。
2.oauth2.0授权常见的例子
比如你登录简书,但是你没有注册简书账号,这个时候呢,你可以选择 使用QQ登录,或者微信登录等方式。
登录.png
点击QQ登录,会跳转到QQ的登录页面。
QQ授权.png
输入账号密码,并选择授权信息之后,你就可以登录简书了。而不需要注册简书的账号,使用QQ账号便完成了次操作。
登录成功.png
oauth2.0涉及到的几个主要概念
资源:上例中的QQ昵称,头像等数据。
资源拥有者:即QQ用户,也就是我。
客户端:要获取资源的第三方应用,即简书网站。
资源服务器:资源存放的服务器,我QQ的头像,昵称放在腾讯QQ的服务器上,即QQ服务器,客户端要资源找他。
授权服务器:客户端要获取资源,先要通过认证,负责认证的家伙就是授权服务器,上例中授权服务器也在QQ那边,因为只有QQ能验证你输入的用户名密码对不对。
oauth2.0认证的流程
大致流程如下图所示:
oauth2.0大致流程.png
上面讲的例子的详细步骤(此图为盗取):
oauth2.0授权详细示例图.png
步骤讲解:
第三方网站登录处,选择鉴权登录。第三方网站会有一个鉴权登录方法,该方法会去调用资源服务器的验证第三方网站有效性的接口,传入第三方网站的clientId(此处没有传秘钥,可能同时传id和秘钥会存在风险),和一个通知回调地址。(比如QQ的验证第三方应用的接口,用以验证第三方网站的有效性,验证成功返回一个临时令牌(授权码))。
QQ端验证了第三方网站的clientid有效后,跳转到QQ的登录页面,让用户登录并选择授权的资源。当用户确定登录和授权后,会将第三方网站第一次请求的数据+用户登录数据一起再次请求验证客户端信息的接口。验证成功之后,QQ 将授权码返回给第三方网站。同时自己也将授权的用户信息与授权码保存在QQ服务器。以供下次验证。
第三方网站根据授权码 访问QQ令牌接口,传入clientid,密码,授权码,回调地址。QQ验证第三方网站clientid,密码。成功后,验证授权码是否存在。如果都成功,则返回一个访问令牌给第三方网站。 并将访问令牌缓存起来。
第三方网站拿到访问令牌后,根据访问令牌访问QQ的接口,QQ验证访问令牌是否有效,有效则将用户数据返回给第三方网站。
存在的一些疑问?
1、为什么要用oauth,而不直接用用户名密码登录。
如果直接用用户名密码,那么你的账号密码就直接暴露给了第三方应用。这是不安全的,你没法控制第三方应用的权限,和使用时间等,你没有办法收回权限,除非你改密码。
就比如现在的装修,你就是资源拥有者,而房子就是你的QQ资源,房门就可以 理解为QQ授权服务器。
你不会直接把你家正式的钥匙(用户名,密码)给装修队,要不然他复制一份,不就可以随时进入你家了(资源),你会使用装修钥匙(token),装修钥匙在你启用正式钥匙后就会失效(取消授权),这就是跟oauth的原理类似的。
2、回调地址验证
必须验证回调地址。第三方应用在注册授权的时候,需要录入回调地址,然后QQ会生成clientId,密码给第三方应用。 在请求授权码时会去验证回调地址是否相同。
3、授权码code 只能使用一次
4、为什么请求授权码的时候只传了clientid ,而拿到授权码code之后,客户端会把授权码code,clientid,和秘钥一起传给服务器?
答:获取授权码时,请求是用户发起的,然后客户端重定向到服务器发起请求,对应的cllientid ,回调地址都是可见的。这个时候不能传递密码。服务器端只验证clientid,初步验证客户端(我是客户端)。而得到授权码之后,客户端后台请求服务器,传递clientid,code,秘钥,这个是验证是否是正确的客户端身份(我真的是客户端)。
后台发起的请求,相对安全。