1 形成「具体问题」已属不易,还要理出「解题思路」,相当不易 2 形式成 具体问题的标志,是用 一些术语表述问题
形成 具体问题 ,和解题思路 是 成长关键现象
可以用storage API,也可使用传统 cookie,后者似乎更合理
实现基本的UA模块,有好几部分的复杂性(分别有相应的工具)
它们包括:
前端
axios : http client lib
storage API
后端
jsonwebtoken : jwt 生成和验证(思路中不用 进行验证,因太简陋)
express-jwt : jwt 验证 (使用此库的原因,是自动化一些任务,例如验证成功后将 token数据附在req.user上)
cookieParser
使用 storage API 保存jwt数据
1 后端:jsonwebtoken生成jwt都是一样,返回时,此方将 jwt 以JSON 格式 返回给client
2 前端:client端使用 axios 接受 ,并保存到 localStorage,备用
3 前端:当要访问private M时,axios 从 localStorage 读出jwt,附加一个特殊的http头:authorization
4 由于一般不止一个 private M,故 更实际的做法 配置一个 axios.interceptors
5 后端:在私有路由配置的前面,配置 express-jwt 中间件,它会自动 验证保存在 authorization 头上的jwt(当然是配置相同的 secret)
使用cookie 保存jwt数据
1 后端:jsonwebtoken生成jwt都是一样,返回时,此方将 jwt 以 cookie 格式 返回给client
2 前端:服务端设置(返回)的cookie是自动保存的(可通过配置生存时间)
L 前端和后端有时候(尤其是在开发阶段)位于不同的域(或端口)上,cookie必须要位于同一个域(或端口),所以要配置proxy
L 同一个问题 ,使用 storage API技术,由于jwt安置 在http 头,前后端可以不同域(但后端要配置CROS中间件)
3 前端:当要访问private M时,axios 不像一般浏览器自动附加cookie(待证),需要配置开启
4 通过一个 { withCredentials: true } 配置字,详细看:https://codewithhugo.com/pass-cookies-axios-fetch-requests/
5 后端:在私有路由配置的前面,配置 express-jwt,对 cookie 进行验证
L getToken: req => req.cookies.token
参考
Pass cookies with axios or fetch requests codewithhugo.com/pass-cookie…
The Ultimate Guide to handling JWTs on frontend clients (GraphQL) hasura.io/blog/best-p…
developer.mozilla.org/en-US/docs/…
Axios Beginner’s Guide: A Handy Promise-based HTTP Client www.sitepoint.com/axios-begin…
Understanding CSRF github.com/pillarjs/un…