一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
Oauth是一种开放的授权标准,允许用户让第三方应用访问其在某一web应用上存储的私密资源,用户不需要将用户名密码提供出来。
Oauth有四种授权方式:
- 密码式 需要把用户名和密码告诉第三方应用,第三方应用使用用户名和密码换取令牌。这个需要用户高度信任第三方应用
- 隐藏式 提供一个跳转到b网站的链接,用户点击后跳转到b网站,向用户请求授权。用户登录并同意后,跳转回A网站制定的redirect_url地址,携带b网站返回的令牌。 这个方案过于依赖前端能力,适用安全性要求不高的场景,因为会收到中间人攻击。
- 凭借式 应用A向应用B请求授权,A有B提前给好的id和key,用来换取令牌,这个不适用于前端场景,适合服务端之间的交互。
- 授权码模式 最常见的一种方式,需要第三方应用先申请一个授权码,然后换取令牌。流程如下: (1)A提供一个跳转到B的链接+redirect_url,用户点击后跳转B站 (2)B站验证通过,跳转回redirect_url并将授权码通过url带回去 (3)A携带授权码向B站发起请求,B验证后,返回access_token
Bearer认证,即令牌认证,是一种http身份验证方式。它的核心就是bearer token,它是由服务端根据密钥生成的加密字符串。当下最流行的编码方式就是jwt,即json web token。
我们每次请求都需要进行鉴权,常见的方法就是生成一个token,然后服务器将这个token缓存起来,后续进行对比。前端每次请求调用,都会把值带上来。也可以采用更为简单的办法,就是直接用密钥签发token,这样可以减少token的额外管理。
jwt是bearer token的一个具体实现,由json数据格式组成,通过hash散列算法生成一个字符串。它的认证流程如下:
- 客户端使用用户名和密码登录
- 服务端验证通过,签发一个token给客户端
- 客户端缓存每次请求带上
- 验证token jwt分为三部分:header,payload,signature 服务端会取出header.payload,然后用相同的加密算法和密钥对进行加密,得到signature,如果与客户端相同,则通过。