Ok, 今天我们来学习 一下 鉴权

鉴权(authentication) 是指验证用户是否拥有访问系统的权利。传统的鉴权是通过密码来验证的。这种方式的前提是,每个获得密码的用户都已经被授权。在建立用户时,就为此用户分配一个密码,用户的密码可以由管理员指定,也可以由用户自行申请。这种方式的弱点十分明显:一旦密码被偷或用户遗失密码,情况就会十分麻烦,需要管理员对用户密码进行重新修改,而修改密码之前还要人工验证用户的合法身份。

为了克服这种鉴权方式的缺点,需要一个更加可靠的鉴权方式。目前的主流鉴权方式是利用认证授权来验证数字签名的正确与否。

逻辑上,授权发生在鉴权之后,而实际上,这两者常常是一个过程。

我们常用的鉴权有四种:

1、HTTP Basic Authentication

2、session-cookie

3、Token 验证

4、OAuth(开放授权)

其他几种,自己去看 相关资料, 今天着重讲下这种 HTTP Basic Authentication

这种授权方式是浏览器遵守http协议实现的基本授权方式,HTTP协议进行通信的过程中,HTTP协议定义了基本认证认证允许HTTP服务器对客户端进行用户身份证的方法。

认证过程:

1. 客户端向服务器请求数据,请求的内容可能是一个网页或者是一个ajax异步请求,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:

Get /index.html HTTP/1.0
Host:www.google.com

2. 服务器向客户端发送验证请求代码401,(WWW-Authenticate: Basic realm=”google.com”这句话是关键,如果没有客户端不会弹出用户名和密码输入界面)服务器返回的数据大抵如下:

HTTP/1.0 401 Unauthorised
Server: SokEvo/1.0
WWW-Authenticate: Basic realm=”google.com”
Content-Type: text/html
Content-Length: xxx

3. 当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。

4. 用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:

Get /index.html HTTP/1.0
Host:www.google.com
Authorization: Basic d2FuZzp3YW5n

注:d2FuZzp3YW5n表示加密后的用户名及密码(用户名:密码 然后通过base64加密,加密过程是浏览器默认的行为,不需要我们人为加密,我们只需要输入用户名密码即可)

5. 服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端。

效果:
客户端未未认证的时候,会弹出用户名密码输入框,这个时候请求时属于pending状态,这个时候其实服务当用户输入用户名密码的时候客户端会再次发送带Authentication头的请求。

我们以Postman 官方 api 为例

img

很多时候,出于安全考虑我们的接口并不希望对外公开。这个时候就需要使用授权(Authorization)机制 授权过程验证您是否具有访问服务器所需数据的权限。 当您发送请求时,您通常必须包含参数,以确保请求具有访问和返回所需数据的权限。 Postman提供授权类型,可以轻松地在Postman本地应用程序中处理身份验证协议。

Postman支持的授权协议类型如下:

  • Inherit auth from parent:是默认的鉴权方式,继承;
  • No Auth:代表不需要鉴权
  • bearer token 鉴权:一般也叫 Json web token,就是发送一个 json 格式的 token 令牌,服务端会针对 token 进行解密验证
  • Basic Auth 基础验证:提供用户名密码验证,postman 会自动生成 authorization,属于最常用鉴权方式
  • digest auth,摘要式认证。在基本身份认证上面扩展了安全性,服务器为每一个连接生成一个唯一的随机数,客户端用这个随机数对密码进行 MD5 加密,然后返回服务器,服务器也用这个随机数对密码进行加密,然后和客户端传送过来的加密数据进行比较,如果一致就返回结果。
    它是一个二次验证的过程,会有两次认证交互消息。客户端请求资源->服务器返回认证标示->客户端发送认证信息->服务器查验认证。
  • Oauth,一般用于第三方认证,有1,2两个版本,需要提供的信息不太一样。也是常用的鉴权方式
  • Hawk 认证,是另一种认证方案,采用的叫消息码认证算法,和 Digest 认证类似,它也是需要二次交互的
  • AWS 签名认证:是针对亚马逊的 AWS 公有云用户签名的认证方式
  • NTLM:是微软的局域网管理认证协议
  • Akamai EdgeGrid:是 Akamai 的专属认证协议
    其中最重要的鉴权方式为:Basic 以及 OAuth2,下面我们通过实例演示下这两种鉴权方式;

Basic auth

基本身份验证是一种比较简单的授权类型,需要经过验证的用户名和密码才能访问数据资源。这就需要我们输入用户名和对应的密码。

案例:请求URL如下,授权账号为:

  • 用户名 : postman
  • 密码 : password
  • 授权协议为: Basic auth

https://postman-echo.com/basic-auth

  • 如果不输入用户名密码,直接使用GET请求,则会返回提示:Unauthorized
  • 输入用户名密码,选择Basic auth授权类型,则会返回如下结果:
"authenticated": true

img

Digest Auth

Digest auth是一个简单的认证机制,最初是为HTTP协议开发的,因此也常叫做HTTP摘要。其身份验证机制非常简单,它采用哈希加密方法,以避免用明文传输用户的口令。摘要认证就是核实参与通信的两方都知道双方共享的一个口令。

当server想要查证用户的身份,它产生一个摘要盘问(digest challenge),并发送给用户。典型的摘要盘问例如以下:

Digest realm=“iptel.org”, qop=“auth,auth-int”, nonce=“dcd98b7102dd2f0e8b11d0f600bfb0c093”, opaque="", algorithm=MD5

这里包含了一组参数,也要发送给用户。用户使用这些参数,来产生正确的摘要回答,并发送给server。摘要盘问中的各个参数,其意义以下:

realm(领域):领域參数是强制的,在全部的盘问中都必须有。它是目的是鉴别SIP消息中的机密。在SIP实际应用中,它通常设置为SIP代理server所负责的域名。

nonce(现时):这是由server规定的数据字符串,在server每次产生一个摘要盘问时,这个參数都是不一样的(与前面所产生的不会雷同)。“现时”一般是由一些数据通过md5杂凑运算构造的。 这种数据通常包含时间标识和server的机密短语。这确保每一个“现时”都有一个有限的生命期(也就是过了一些时间后会失效,并且以后再也不会使用),并且是独一无二的 (即不论什么其他的server都不能产生一个同样的“现时”)。

algorithm(算法):这是用来计算的算法。当前仅仅支持MD5算法。

qop(保护的质量):这个參数规定server支持哪种保护方案。client能够从列表中选择一个。值 auth表示仅仅进行身份查验, auth-int表示进行查验外,另一些完整性保护。须要看更具体的描写叙述,请參阅RFC2617。

案例 :

请求URL: https://postman-echo.com/digest-auth

摘要配置信息如下:用户名密码和上面basic auth一样

Digest username=“postman”, realm=“Users”, nonce=“ni1LiL0O37PRRhofWdCLmwFsnEtH1lew”, uri="/digest-auth", response=“254679099562cf07df9b6f5d8d15db44”, opaque=""

img

执行请求结果如下:

执行请求结果如下:

{
"authenticated": true
}

OAuth 1.0

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

扩展资料:

案例

请求URL如下:请求方式为GET,Add authorization data to设置为:Request Headers

https://postman-echo.com/oauth1

参数配置为:

  • Consumer Key: RKCGzna7bv9YD57c
  • Consumer Secret: D+EdQ-gs$-%@2N

img

发送请求结果如下:

{"status": "pass",

"message": "OAuth-1.0a signature verification was successful"
}

如果Consumer Secret错误则返回如下结果:

{"status": "fail",

"message": "HMAC-SHA1 verification failed",

"base_uri": "https://postman-echo.com/oauth1",

"normalized_param_string": "oauth_consumer_key=RKCGzna7bv9YD57c&oauth_nonce=9Tp6pr0xQwV&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1612414971&oauth_version=1.0",

"base_string": "GET&https%3A%2F%2Fpostman-echo.com%2Foauth1&oauth_consumer_key%3DRKCGzna7bv9YD57c%26oauth_nonce%3D9Tp6pr0xQwV%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1612414971%26oauth_version%3D1.0",

"signing_key": "D%2BEdQ-gs%24-%25%402Nu7&"
}

扩展资料:各个授权协议文档

Hawk Authentication

Hawk Auth是一个HTTP认证方案,使用MAC(Message Authentication Code,消息认证码算法)算法,它提供了对请求进行部分加密验证的认证HTTP请求的方法。hawk方案要求提供一个共享对称密匙在服务器与客户端之间,通常这个共享的凭证在初始TLS(安全传输层协议)保护阶段建立的,或者是从客户端和服务器都可用的其他一些共享机密信息中获得的。

案例

请求URL如下: https://postman-echo.com/auth/hawk

密钥信息如下:

  • Hawk Auth ID: dh37fgj492je
  • Hawk Auth Key: werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn
  • Algorithm: sha256

img

{"message": "Hawk Authentication Successful"}

如果将key改为其他任意的字符则返回如下结果:

{"statusCode": 401,

"error": "Unauthorized",

"message": "Bad mac",

"attributes": {

    "error": "Bad mac"

}
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐