前言

最近在挖src的时候遇见了一些认证机制,于是在网上查看了一些相关文章,这里将其做一些总结,均来自于网上。

Cookie Auth

这是一种传统的认证方式,大部分网站还在采取这种认证方式,简单来说cookie认证方式就是客户端在访问服务端时,服务端会生成一个session对象,返回给客户端一个cookie,之后客户端浏览器所有的请求都会带上这个cookie来访问服务端,在关闭浏览器时被删除。

image.png

采用cookie认证机制可以看到如果在没有进行其他校验的情况下很容易受到csrf攻击,xss攻击。

Token Auth

基于Token鉴权机制的网站往往有更好的安全性,认证流程

  1. 用户通过用户名密码登陆
  2. 服务器校验用户密码以及相关信息
  3. 返回给用户一个token
  4. 服务端报错token,每次发送时带上token
  5. 服务端校验token,返回数据。

这个认证过程和cookie认证有着很多相似之处,但是也存在差异,安全性也得到了提高。

这种一般在请求头中会出现:Authorization这类的字段,很多厂商都是用的这种认证,特别是一些sso单点登录系统都会采用这种认证方式。

由于sso的存在,所以服务端需要支持cors(跨域资源共享)策略。

image.png

这类的认证就不用考虑csrf的攻击,最常见的就是jwt(json web token)。

HTTP Basic Auth

就是每次请求api都带上账号密码,比如在header中带上Authorization:Basic xxxx现在基本已经被抛弃

OAuth2.0

OAuth(open Authrization)是一个开放授权标准,共有4总访问模式,运行用户让第三方应用访问该用户在web服务的资源,OAuth允许用户提供一个令牌,每一个令牌运行在特定的时间段访问特定的资源image.png

这种认证机制被广泛运用,社交类的app,常见的第三方登陆,绑定等。

下面是详细解析:

涉及到3个角色:

  1. 服务提供方:提供受保护的资源和服务
  2. 用户:存了东西在服务方的人
  3. 客服端:服务调用方

认证过程:

image.png

如上图所示:

  1. 用户访问第三方应用程序,客服端要求用户给与权限
  2. 用户同意授权
  3. 客户端使用获得的授权,向服务提供方申请令牌
  4. 认证服务器对客户端认证以后,发放令牌
  5. 客户端使用令牌想服务器申请资源
  6. 服务器确认无误,开放资源

在第二步中,用户给与客户端授权,授权分为4中模式

四种授权模式
  1. 授权码模式
  2. 简化模式
  3. 密码模式
  4. 客户端模式

授权码模式是比较完善的一种模式,引用也比较全面,相对较为安全

授权过程:

image.png

  1. 用户访问客服端,客户端将用户导向认证服务器
  2. 用户选择是否授权
  3. 用户授权,认证服务器将用户导向客户端实现指定的重定向url,附上一个授权码
  4. 客服端得到授权码,附上重定向url,向认证服务端申请令牌,这一步在在客户端的后台服务器进行,用户不可见
  5. 认证服务器核对了授权码和重定向url,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)

下面是一个实例:

image.png

阿里云的登陆界面,这里采用qq登陆:

image.png

可以看到这个页面url:

www.xxx.com/oauth2.0/authorize?client_id=101488968&response_type=code
&redirect_uri=https%3A%2F%2Fcloud.tencent.com%2Flogin%2FqqAccessCallback%3Fs_url%3Dhttps%253A%252F%252Fconsole.cloud.tencent.com%252Fcvm%252Finstance%252Findex%253Frid%253D1%26fwd_flag%3D7&state=r1VjE8EMEE

参数说明:

clien_id:客户端id,必填

response_type:授权类型 code,也就是授权码模式

redirect_uri:重定向url

scope:权限范围

state:当前状态

接下来就是第二步骤:

image.png

用户输入账号密码并要求授权,正常来说,用户授权登陆之后,会被重定向到redict_url并得到code

image.png

客户端得到code:

这里比较重要的还有state参数,如果客户端请求中包含这个参数,那么认证服务器也必须一模一样包含这个参数,但是许多开发者往往为校验这个参数导致一些安全问题。

image.png

接下来客服端会在后台利用code请求token。而不会利用浏览器跳转等方式来获取。

重点

  1. code模式下的认证过程
  2. redict_url的作用范围
  3. secret作用理解
  4. state状态参数作用
Last modification:December 2nd, 2020 at 09:24 am