身份认证的方法
- 基于session认证
- 基于token认证
- HTTP Basic Auth
- OAuth
HTTP Basic Auth
HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API 使用的最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,在开发对外开放的RESTful API时,尽量避免采用HTTP Basic Auth。
OAuth
OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
基于session认证
流程图
弊端
- 通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
- 扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
- CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击
基于token认证
流程图
这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *
什么是JWT
概念
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
token相当于加密过的session记录,token方式中有种方式叫JWT,他有自己的固定格式、生成方式。
格式
在jwt终,token格式:Header.Payload.Signature
Header表示 Token 相关的基本元信息,如 Token 类型、加密方式(算法)等,具体如下(alg是必填的,其余都可选)
这些字段都是可选的,Payload 只要是合法 JSON 即可
生成
生成方法:Base64编码的Header.Base64编码的Payload.对前两部分按指定算法加密的结果。加密方法就是Header里写到的alg的值
PS:base64后的header、payload,要去掉末尾等号(padding trailing equals)
传输
服务端通过把token放入响应体来传输;客户都安通过把token放入标头来传输。
当token传给Client时:
当请求数据时,从client发token给Server时:
认证
step 1. 服务器端从head中的Authentication中拿出接收到的token step 2. 检查token有无过期:从payload中拿出iat、nbf、exp,需满足:iat签发时间<=nbf生效时间<当前时间<exp过期时间 step 3. 验证签名
其他
基于session和token都可以做SSO(单点登录)
两个问题
- 怎么同步不同机器的session以及共享cookie 答:登录成功后把响应cookie的domain设置为通配兄弟应用域名的形式,并且所有应用都以身份验证服务同步session
- 如何共享token 答:比如进入兄弟应用时通过URL带上token。