RESTFUL API API身份认证

核心内容:

1.介绍 API 身份验证的常用机制
2.介绍如何进行 API 身份验证

API身份认证:

在典型业务场景中,为了区分用户和安全保密,必须对 API 请求进行鉴权,
但是不能要求每一个请求都进行登录操作。合理做法是,在第一次登录之后产生一个有一定有效期的 token,并将其存储于浏览器的 Cookie 或 LocalStorage 之中,之后的请求都携带该 token ,请求到达服务器端后,服务器端用该 token 对请求进行鉴权。在第一次登录之后,服务器会将这个 token 用文件、数据库或缓存服务器等方法存下来,用于之后请求中的比对。或者,更简单的方法是,直接用密钥对用户信息和时间戳进行签名对称加密,这样就可以省下额外的存储,也可以减少每一次请求时对数据库的查询压力。这种方式,在业界已经有一种标准的实现方式,该方式被称为 JSON Web Token(JWT,音同 jot,详见 JWT RFC 7519)。
token是“令牌”的意思,里面包含了用于认证的信息。

JWT简介:

RESTFUL API API身份认证_第1张图片

1.客户端使用用户名和密码请求登录
2.服务端收到请求后去验证用户名和密码,如果用户性和密码跟数据库的记录不一样就验证失败,如果一致,则通过验证,服务端会签发一个Token返回给客户端
3.客户端收到请求后会将Token缓存起来,比如放在浏览器Cookie中或者本地存储中,之后每次请求都会携带该Token
4.服务端收到请求会验证客户端携带的Token,验证成功会进行逻辑处理并返回数据
在JWT中,Token有三部分组成,中间用.隔开,并使用Base64编码:
header
payload 有效载荷
signature 签名
下面是JWT中一个Token的示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1MjgwMTY5MjIsImlkIjowLCJuYmYiOjE1MjgwMTY5MjIsInVzZXJuYW1lIjoiYWRtaW4ifQ.LjxrK9DuAwAzUD8-9v43NzWBN7HXsSLfebw92DKd1JQ

header介绍:

JWT Token 的 header 中,包含两部分信息:
Token 的类
2.Token 所使用的加密算法
{
“typ”: “JWT”,
“alg”: “HS256”
}
该例子说明Token类型是JWT,加密算法是HS256(alg算法可以有很多种)。

Payload载荷介绍:

Payload中携带Token的具体内容,里面有一些标准的字段,当然你也可以添加额外的字段,来表达更丰富的信息,可以用这些信息来做更丰富的处理,比如记录请求用户名,标准字段有:iss:JWT Token 的签发者
iss:JWT Token 的签发者
sub:主题
exp:JWT Token 过期时间
aud:接收 JWT Token 的一方
iat:JWT Token 签发时间
nbf:JWT Token 生效时间
jti:JWT Token ID

本例中的payload内容:
{
“id”: 2,
“username”: “kong”,
“nbf”: 1527931805,
“iat”: 1527931805
}

Signature签名介绍:

Signature是Token的签名部分,通过如下方式生成:
1.用Base64对header.payload进行编码
2.用Secret对编码后内容进行加密,加密后内容即为Signature
Secret 相当于一个密码,存储在服务端,一般通过配置文件来配置 Secret 的值。
RESTFUL API API身份认证_第2张图片

签名后服务端会返回生成的 Token,客户端下次请求会携带该 Token,服务端收到 Token 后会解析出 header.payload,然后用相同的加密算法和密码对 header.payload 再进行一次加密,并对比加密后的 Token 和收到的 Token 是否相同,如果相同则验证通过,不相同则返回 HTTP 401 Unauthorized 的错误。

如何进行API身份验证:

API身份认证包括两步:
1.签发token
2.API添加认证middleware

签发Token:

API身份认证包括两步:
1.签发token
2.API添加认证middleware
签发Token
首先要实现登录接口。在登录接口之后采用明文校验用户名和密码的方式,登录成功之后再产生token。在router/router.go文件中添加登录入口:

// api for authentication functionalities
g.POST(“/login”, user.Login)
在handle/user/login.go中添加login的具体实现:
1.解析用户名和密码
2.通过 auth.Compare() 对比密码是否是数据库保存的密码,如果不是,返回 errno.ErrPasswordIncorrect 错误
3.如果相同,授权通过,通过 token.Sign() 签发 token 并返回

API添加认证middleware:

在 router/router.go 中对 user handler 添加授权 middleware:
RESTFUL API API身份认证_第3张图片

通过该 middleware,所有对 /v1/user 路径的请求,都会经过 middleware.AuthMiddleware() 中间件的处理:token 校验。middleware.AuthMiddleware() 函数是通过调用 token.ParseRequest() 来进行 token 校验的。

你可能感兴趣的:(restful,http,后端)