• OAuth2.0认证和授权机制讲解


    OAuth2.0的基本流程

    OAuth协议目前已经升级到了2.0,大部分的网站也是支持OAuth2.0的,因此让我们先看看OAuth2。

     上图中所涉及到的对象分别为:

    • Client 第三方应用,我们的应用就是一个Client
    • Resource Owner 资源所有者,即用户
    • Authorization Server 授权服务器,即提供第三方登录服务的服务器,如Github
    • Resource Server 拥有资源信息的服务器,通常和授权服务器属于同一应用

    根据上图的信息,我们可以知道OAuth2的基本流程为:

    1. 第三方应用请求用户授权。
    2. 用户同意授权,并返回一个凭证(code)
    3. 第三方应用通过第二步的凭证(code)向授权服务器请求授权
    4. 授权服务器验证凭证(code)通过后,同意授权,并返回一个资源访问的凭证(Access Token)。
    5. 第三方应用通过第四步的凭证(Access Token)向资源服务器请求相关资源。
    6. 资源服务器验证凭证(Access Token)通过后,将第三方应用请求的资源返回。

    微信OAuth2.0授权登陆系统就是基于OAuth2.0协议标准构建的,只是它的授权服务器和资源服务器都是微信开发平台。

    以一个第三方登陆为例

    第0步. 引导用户进行授权:

    当用户希望使用第三方登录进行登录时,第三方应用会通过类似下图【快速登录】的方式将用户引导至授权页面,为了和OAuth基本流程一致,我们将这一步定义为第0步。

    第0.5步. 用户身份验证

    当我们点击Github的图标,我们会进入到Github应用下面,此时实际上进行了一次用户身份的验证,之前没有登录Github的用户需要输入Github的账号密码,已登录的用户Github会根据Session进行身份确认。此操作我们称为0.5步。接下来正式进入OAuth2的流程

    第1步. 用户授权

    用户身份确认后会进入下面这个页面,该页面由授权服务器提供,授权服务器会告诉用户该第三方在授权服务器中提交的相关信息(如果需要实现第三方登录功能,第三方应用需要向Github、微博等应用中提交应用的相关信息,不同服务可能会需要审核等不同的步骤),以及授权后第三方应用能够获取哪些资源。在Github中,最基础的认证可以访问用户的公共信息。如果用户同意授权,需要主动的点击【Authorize application】按钮。

    第2步. 返回用户凭证(code)

    当用户点击按钮同意授权后,授权服务器将生成一个用户凭证(code),此时授权服务器如何将用户凭证(code)传递给第三方应用呢?

    当我们向授权服务器提交应用信息时,通常需要填写一个redirect_uri,当我们引导用户进入授权页面时,也会附带一个redirect_uri的信息(如Sign in to GitHub · GitHub),当授权服务器验证两个URL一致时,会通知浏览器跳转到redirect_uri,同时,在redirect_uri后附加用户凭证(code)的相关信息,此时,浏览器返回第三方应用同时携带用户凭证(code)的相关信息。授权后访问的redirect_uri如下:

    http://tianmaying.com/oauth/github/callback?code=9e3efa6cea739f9aaab2&state=XXX

    这样第三方就得到了临时凭证code。

    其他攻击者拿到用户凭证(code)后依然无法获取到相应的用户资源,因为还需要授权服务器授权。

    第3步. 请求授权服务器授权

    要拿到授权服务器的授权,需要以下几个信息:

    • client_id 标识第三方应用的id,由授权服务器(Github)在第三方应用提交时颁发给第三方应用
    • client_secret 第三方应用和授权服务器之间的安全凭证,由授权服务器(Github)在第三方应用提交时颁发给第三方应用
    • code 第一步中返回的用户凭证redirect_uri 第一步生成用户凭证后跳转到第二步时的地址
    • state 由第三方应用给出的随机码

    我们看到,上述信息还涉及到第三方应用的安全凭证(client_secret),因此要求OAuth要求该请求必须时POST请求,同时,还必须时HTTPS服务,以此保证获取到的验证凭证(Access Token)的安全性。

    第4步. 拿到验证凭证(Access Token)

    当授权服务器拿到第3步中的所有信息,验证通过后,会将Access Token返回给第三方应用。

    第5步. 请求访问用户资源

    拿到验证凭证(Access Token)后,剩下的事情就很简单了,资源服务器会提供一系列关于用户资源的API,拿验证凭证(Access Token)访问相应的API即可,例如,在GIthub中,如果你想拿到用户信息,可以访问以下API:

    GET https://api.github.com/user?access_token=...

    第6步. 返回资源

    如果验证凭证(Access Token)是正确的,此时资源服务器就会返回资源信息,此时整个OAuth流程就结束了。

    看完OAuth2的资源访问流程,我们的第三方登录是如何做的呢?首先我们需要知道两点:

    • 用户授权信息在授权服务器中是有记录的,当用户第一次授权给相应的第三方应用后,不需要进行再次授权
    • 每个用户在资源服务器中都有一个唯一的ID(例如微信小程序有个openid),第三方应用可以将其存储起来并与本地用户系统一一对应起来

    这样,当用户第一次授权并且注册后(主动注册或者第三方应用使用用户信息默认注册),当再次点击第三方登录的按钮,浏览器跳转到授权服务器,授权服务器通过Session找到用户的授权信息,发现该用户已经授权给该第三方应用,将直接跳转到redirect_uri,此时第三方应用通过唯一的用户ID找到相应的本地用户,自动帮助其登录。

    这样,就可以达到直接点击第三方登录按钮,不需要任何操作,经过几次跳转后自动登录的效果了。大家快去试试吧。

    参考链接:https://zhuanlan.zhihu.com/p/20913727

  • 相关阅读:
    ubuntu16.04添加开机启动任务
    Elasticsearch-5.0.0移植到ubuntu16.04
    转:解决npm install慢的问题
    解决virtualbox装ghost xp装驱动时报portcls.sys蓝屏的问题
    git文件迁移到新架构
    ubuntu16.04文件形式安装mongodb
    linux启动流程
    启动WAMPSERVER出现计算机中丢失 MSVCR110.dll
    socket编程的网络协议
    PHP7的新特性
  • 原文地址:https://www.cnblogs.com/lfri/p/12595473.html
Copyright © 2020-2023  润新知