oauth
traditional authentication
传统认证使用 session:
- client 发送 username、password 给 server
- server 查数据库,检查信息,是否正确。正确就把用户登录信息(即用户状态)写到 session 里(即服务器内存中),并将 sessionId 返回给 client。
- client 在请求 api 时,在 cookie 中传递 sessionId。server 端根据 sessionId 获取用户登录信息,如果已认证,返回正常响应;反之,401
这种方式有个缺陷:如果做分布式服务部署,那么需要每个服务器都要同步相同的登录信息,这不是一个好的方式。所以一般 rest 微服务都要求的是 stateless,即 server 端不保存任何用户信息,请求中包含所有需要的信息。
oauth
oauth 是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth允许用户提供一个 令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
其令牌可以是 JWT 或其他形式。
ref: oauth 2.0 的用途
Auth0
autho0 实现了很多开放标准,包括 oauth。(学习视频)
- 要使用 Auth0,首先需要创建一个 App(被称作 client),其中定义了 clientId、domain name、callbackUrl、secret 等。
- 前端交互:
- 当访问某个页面时,查看 localstorage,看用户是否登录;
- 如果未登录,利用 Auth0 sdk 或 api 登录认证(提供前边 App 中的 clientId、secret 等信息),认证通过将认证信息(token 等)存入 localstorage,并跳转到 callback url
- 如果登录,直接访问
- 后端交互:
- 前端携带 token 访问 API
- server 利用 Auth0 sdk 或 api 验证 token 的有效性;认证通过返回资源,否则 401