OAuth 2.0
OAuth 2.0 是一种授权机制,主要用来颁发令牌(token)。OAuth 的核心就是向第三方应用颁发令牌。
概念及解释
- 授权码(authorization-code) // 需要经过授权码,适用于有前后端
- 隐藏式(implicit) // 适用于没有后端的应用,不需要授权码
- 密码式(password): // 直接用用户名密码,用于内部应用
- 客户端凭证(client credentials) // 适用与对APP授权,而不是单个用户
四种方式都需要在B站先注册
OpenID 和 OAuth
两者很像,但本质上来说它们是截然不同的两个东西:
- OpenID: 只用于 身份认证(Authentication),允许你以 同一个账户 在 多个网站登陆。它仅仅是为你的 合法身份 背书,当你以 Facebook 账号登陆某个站点之后,该站点 无权访问 你的在 Facebook 上的 数据。
- OAuth: 用于 授权(Authorisation),允许 被授权方 访问 授权方 的 用户数据。
Access Token 和 Refresh Token
职责的分离:
- refresh token: 负责 身份认证;
- access token: 负责 请求资源。
JWT(JsonWebToken)
JWT 顾名思义,它是 JSON 结构的 token,由三部分组成:
- header
- payload
- signature
header 用于描述 元信息,例如产生 signature 的算法:
{ "typ": "JWT", "alg": "HS256"}
payload 用于携带你希望 向服务端传递的信息。你既可以往里添加 官方字段,例如:iss(Issuer), sub(Subject), exp(Expirationtime),也可以塞入 自定义的字段
{ "userId": "b08f86af-35da-48f2-8fab-cef3904660bd"}
signature 译为 签名,创建签名要分以下几个步骤:
- 从 接口服务端 拿到 密钥,假设为 secret。
- 对 header 进行 base64 编码,假设结果为 headerStr。
- 将 payload 进行 base64 编码,假设结果为 payloadStr。
- 将 headerStr 和 payloadStr 用 . 字符 拼装起来成为字符 data。
- 以 data 和 secret 作为参数,使用 哈希算法 计算出 签名。