关于 RESTFUL API 常用认证方式

1,HTTP Basic

Basic admin:admin 
Basic YWRtaW46YWRtaW4= 
Authorization: Basic YWRtaW46YWRtaW4=
 
由于HTTP协议是无状态的,所有每次请求都得带上身份信息,基于Http basic验证就是简单的将用户名和密码base64编码放到header中,一般需要HTTPS,安全性较低,实现的方式可以基于代码实现也可以基于web容器配置apache,nginx等web服务器即可实现。

2,HTTP Digest

摘要认证 digest authentication,服务器端以nonce进行质询,客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础产生的response信息进行认证的方式。 
    ※ 不包含密码的明文传递 
    摘要认证步骤: 
     1. 客户端访问一个受http摘要认证保护的资源。 
     2. 服务器返回401状态以及nonce等信息,要求客户端进行认证。 
HTTP/1.1 401 Unauthorized 
WWW-Authenticate: Digest 
realm="[email protected]", 
qop="auth,auth-int", 
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", 
opaque="5ccc069c403ebaf9f0171e9517f40e41" 
     3. 客户端将以用户名,密码,nonce值,HTTP方法, 和被请求的URI为校验值基础而加密(默认为MD5算法)的摘要信息返回给服务器。
           认证必须的五个情报: 
・ realm : 响应中包含信息 
・ nonce : 响应中包含信息 
・ username : 用户名 
・ digest-uri : 请求的URI 
・ response : 以上面四个信息加上密码信息,使用MD5算法得出的字符串。

Authorization: Digest 
username="Mufasa", ← 客户端已知信息 
realm="[email protected]", ← 服务器端质询响应信息 
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", ← 服务器端质询响应信息 
uri="/dir/index.html", ← 客户端已知信息 
qop=auth, ← 服务器端质询响应信息 
nc=00000001, ← 客户端计算出的信息 
cnonce="0a4f113b", ← 客户端计算出的客户端nonce 
response="6629fae49393a05397450978507c4ef1", ← 最终的摘要信息 ha3 
opaque="5ccc069c403ebaf9f0171e9517f40e41" ← 服务器端质询响应信息 
     4. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。

     注意事项: 
     1. 避免将密码作为明文在网络上传递,相对提高了HTTP认证的安全性。 
     2. 当用户为某个realm首次设置密码时,服务器保存的是以用户名,realm,密码为基础计算出的哈希值(ha1),而非密码本身。 
     3. 如果qop=auth-int,在计算ha2时,除了包括HTTP方法,URI路径外,还包括请求实体主体,从而防止PUT和POST请求表示被人篡改。 
     4. 但是因为nonce本身可以被用来进行摘要认证,所以也无法确保认证后传递过来的数据的安全性。

   ※ nonce:随机字符串,每次返回401响应的时候都会返回一个不同的nonce。 
   ※ nounce:随机字符串,每个请求都得到一个不同的nounce。 
      ※ MD5(Message Digest algorithm 5,信息摘要算法) 
         1)用户名:realm:密码 ⇒ ha1 
         2)HTTP方法:URI ⇒ ha2 
         3)ha1:nonce:nc:cnonce:qop:ha2 ⇒ ha3

3,WSSE(WS-Security)

WSSE UsernameToken 
    服务器端以nonce进行质询,客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础产生的response信息进行认证的方式。 
    ※ 不包含密码的明文传递 
    WSSE认证步骤: 
     1. 客户端访问一个受WSSE认证保护的资源。 
     2. 服务器返回401状态,要求客户端进行认证。 
HTTP/1.1 401 Unauthorized 
WWW-Authenticate: WSSE 
realm="[email protected]", 
profile="UsernameToken" ← 服务器期望你用UsernameToken规则生成回应 
※ UsernameToken规则:客户端生成一个nonce,然后根据该nonce,密码和当前日时来算出哈希值。 
     3. 客户端将生成一个nonce值,并以该nonce值,密码,当前日时为基础,算出哈希值返回给服务器。 
Authorization: WSSE profile="UsernameToken" 
X-WSSE:UsernameToken 
username="Mufasa", 
PasswordDigest="Z2Y......", 
Nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", 
Created="2010-01-01T09:00:00Z" 
     4. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。

4,OAUTH 2.0

OATH2设计更侧重对资源的授权,OAUTH2规范定义了Authorization Code,Resource Owner Password Credentials,Client Credentials ,Implicit Grant几种实现方式,具体看:OAuth2.0基础概述 ,Authorization Code 模式侧重对第三方用户资源的授权(如QQ联合登录,微博开放平台等),Resource Owner Password Credentials 侧重对个人用户资源授权(如App),Client Credentials 侧重对客户端的资源授权,Implicit Grant 是一种最简化模式,如网页中JS中调用,适用场景比较局限。

5,JWT

JWT 是JSON Web Token简写,用于发送通过签名和认证的东西,服务端可通过解析该值来验证是否有操作权限,是否过期等安全性检查等。

3

猜你喜欢

转载自blog.csdn.net/shrek11/article/details/84190766