手动实现JSON Web Token认证机制

概述

当今大前端与服务器交互的过程中,集成Token认证机制,原因主要有以下几点:

  • 避免用户多次输入密码、避免在终端直接存储用户的密码、实现自动登陆
  • 标示客户端的请求是否合法
  • 避开同源策略
  • 避免 CSRF 攻击
  • Token 可以是无状态的,可以在多个服务间共享

本文主要对以下问题分析:

  • Token认证原理
  • OAuth2基本概念及运作流程
  • JWT实现原理
  • JDK1.6环境第三方JWT不兼容问题分析

本文将实现以下功能:

  • 手动实现JWT,兼容Java5、6、7、8

希望读者具备:

  • 信息安全基本原理知识
  • 网络传输的加密、解密、签名开发经验
  • JavaEE开发经验
  • redis集成经验
  • CORS跨域经验

开发环境

JDK 1.8 / Spring 3.2+ /redis / IntelliJ IDEA 2018.2.6

关于OAuth2

OAuth 2 是一个授权框架,或称授权标准,它可以使第三方应用程序或客户端获得对HTTP服务上(例如 Google,GitHub )用户帐户信息的有限访问权限。OAuth 2 通过将用户身份验证委派给托管用户帐户的服务以及授权客户端访问用户帐户进行工作。综上,OAuth 2 可以为 Web 应用 和桌面应用以及移动应用提供授权流程。

OAuth2认证和授权过程

在认证和授权的过程中涉及的三方包括:

  • 服务提供方,用户使用服务提供方来存储受保护的资源,如照片,视频,联系人列表。

  • 用户,存放在服务提供方的受保护的资源的拥有者

  • 客户端,要访问服务提供方资源的第三方应用,通常是网站,如提供照片打印服务的网站。在认证过程之前,客户端要向服务提供者申请客户端标识。

使用OAuth进行认证和授权的过程如下:

  1. 用户访问客户端的网站,想操作用户存放在服务提供方的资源。
  2. 客户端向服务提供方请求一个临时令牌。
  3. .服务提供方验证客户端的身份后,授予一个临时令牌。
  4. 客户端获得临时令牌后,将用户引导至服务提供方的授权页面请求用户授权。在这个过程中将临时令牌和客户端的回调连接发送给服务提供方。
  5. 用户在服务提供方的网页上输入用户名和密码,然后授权该客户端访问所请求的资源。
  6. 授权成功后,服务提供方引导用户返回客户端的网页。
  7. 客户端根据临时令牌从服务提供方那里获取访问令牌。
  8. 服务提供方根据临时令牌和用户的授权情况授予客户端访问令牌。
  9. 客户端使用获取的访问令牌访问存放在服务提供方上的受保护的资源。

关于Token

Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。

待填坑