OAuth与JWT

75 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

Oauth是一种开放的授权标准,允许用户让第三方应用访问其在某一web应用上存储的私密资源,用户不需要将用户名密码提供出来。

Oauth有四种授权方式:

  1. 密码式 需要把用户名和密码告诉第三方应用,第三方应用使用用户名和密码换取令牌。这个需要用户高度信任第三方应用
  2. 隐藏式 提供一个跳转到b网站的链接,用户点击后跳转到b网站,向用户请求授权。用户登录并同意后,跳转回A网站制定的redirect_url地址,携带b网站返回的令牌。 这个方案过于依赖前端能力,适用安全性要求不高的场景,因为会收到中间人攻击。
  3. 凭借式 应用A向应用B请求授权,A有B提前给好的id和key,用来换取令牌,这个不适用于前端场景,适合服务端之间的交互。
  4. 授权码模式 最常见的一种方式,需要第三方应用先申请一个授权码,然后换取令牌。流程如下: (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散列算法生成一个字符串。它的认证流程如下:

  1. 客户端使用用户名和密码登录
  2. 服务端验证通过,签发一个token给客户端
  3. 客户端缓存每次请求带上
  4. 验证token jwt分为三部分:header,payload,signature 服务端会取出header.payload,然后用相同的加密算法和密钥对进行加密,得到signature,如果与客户端相同,则通过。