什么是用户鉴权
用户鉴权,一种用于在通信网络中对试图访问来自服务提供商的服务的用户进行鉴权的方法。用于用户登陆到DSMP或使用数据业务时,业务网关或Portal发送此消息到DSMP,对该用户使用数据业务的合法性和有效性(状态是否为激活)进行检查。来自百度百科:用户鉴权
四种鉴权的机制
1、HTTP Basic Authentication
这种授权方式是浏览器遵守 http 协议实现的基本授权方式,HTTP 协议进行通信的过程中,HTTP 协议定义了基本认证认证允许 HTTP 服务器对客户端进行用户身份证的方法。
2、session-cookie
HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。
3、Token 令牌
认证过程
用户输入登陆凭据;
服务器验证凭据是否正确,然后返回一个经过签名的token;
客户端负责存储token,可以存在localstorage,或者cookie中
对服务器的请求带上这个token;
服务器对 JWT 进行解码,如果 token 有效,则处理该请求;
一旦用户登出,客户端销毁 token。
4、OAuth(开放授权)
OAUTH 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 OAUTH 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAUTH 是安全的。同时,任何第三方都可以使用 OAUTH 认证服务,任何服务提供商都可以实现自身的 OAUTH 认证服务,因而 OAUTH 是开放的。
我们常见的提供 OAuth 认证服务的厂商有支付宝,QQ,微信。
OAuth 协议又有 1.0 和 2.0 两个版本。相比较 1.0 版,2.0 版整个授权验证流程更简单更安全,也是目前最主要的用户身份验证和授权方式。
参考资料:4种常见的鉴权方式及说明
下面将使用 Token 令牌的方式。在此之前我们先了解一下 JWT
什么是 JWT (JSON Web Token)
1、概念
JSON Web Token (JWT) 是一种开放标准 ( RFC 7519 ),它定义了一种紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。由于此信息经过数字签名,因此可以验证和信任。JWT 可以使用秘密(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。
2、JWT 结构是什么样子的?
JSON Web Token 由用点 .
分隔的三个部分组成,它们是:
2.1、header(标题)
标头通常由两部分组成:令牌的类型,即 JWT,以及正在使用的签名算法,例如 HMAC SHA256 或 RSA。
{ "alg": "HS256", "typ": "JWT" }
然后,这个 JSON 被 Base64Url 编码以形成 JWT 的第一部分。
2.2、payload(有效载荷)
令牌的第二部分是负载,其中包含声明。声明是关于实体(通常是用户)和附加数据的声明。
共有三种类型的声明:
注册声明:这些是一组预定义的声明,这些声明不是强制性的,而是推荐的,以提供一组有用的、可互操作的声明。其中一些是: iss(发行者)、 exp(到期时间)、 sub(主题)、 aud(受众)等。
公共声明:这些可以由使用 JWT 的人随意定义。但是为了避免冲突,它们应该在 IANA JSON Web Token Registry 中定义,或者定义为包含抗冲突命名空间的 URI。
私人声明:这些都是使用它们同意并既不是当事人之间建立共享信息的自定义声明注册或公众的权利要求。
一个示例有效载荷可能是:
{ "sub": "1234567890", "name": "kaimo 313", "admin": true }
然后对有效负载进行 Base64Url 编码以形成 JSON Web 令牌的第二部分。
注意点:
- 声明名称只有三个字符,因为 JWT 是紧凑的。
- 对于已签名的令牌,此信息虽然受到防篡改保护,但任何人都可以读取。除非加密,否则不要将机密信息放入 JWT 的负载或标头元素中。
2.3、signature(签名)
要创建签名部分,必须获取编码的标头、编码的有效载荷、秘密、标头中指定的算法,并对其进行签名。
例如,如果要使用 HMAC SHA256 算法,则签名将通过以下方式创建:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
因此,JWT 通常如下所示。
xxxxx.yyyyy.zzzzz
3、JSON 网络令牌如何工作?
每当用户想要访问受保护的路由或资源时,用户代理应发送 JWT,通常在使用Bearer模式的Authorization标头中。标题的内容应如下所示:
Authorization: Bearer <token>
服务器的受保护路由将检查 Authorization 标头中的有效 JWT ,如果存在,则用户将被允许访问受保护的资源。
特别注意
secret 是保存在服务器端的,jwt 的签发生成也是在服务器端的,secret 就是用来进行jwt的签发和 jwt 的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个 secret, 那就意味着客户端是可以自我签发 wt 了。
参考资料:
解码、验证和生成 JWT
3、JWT 使用的场景
授权:这是使用 JWT 最常见的场景。用户登录后,每个后续请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并且能够轻松跨不同域使用。
信息交换:JSON Web Token 是一种在各方之间安全传输信息的好方法。因为 JWT 可以被签名——例如,使用公钥/私钥对——你可以确定发件人就是他们所说的那样。此外,由于使用标头和有效负载计算签名,您还可以验证内容是否未被篡改。