API 鉴权

▎常见的鉴权模型

  • OAuth 2.0
  • ClientSide A <-(token)-> B, A -> B
  • ServerSide A -> B

> OAuth 2.0

这是一种平台上常见的方法,用户授权去拿它的数据。

是一种用户参与的主动行为。

> ClientSide

Client 不一样,Client 都是向服务端申请一个 token 令牌,再由这个令牌去查信息的。
原因主要是 Client 轻量,不适合保存私钥,也不适合计算 token。

Client 用于用户自己使用网页登录的模式。

> ServerSide

Server 方式,用于两个系统间通信,而 Client 的方式,则用于向手机端签发一个 token。

ServerSide 也有两种常用的方式

  • app key、secret 模式
  • 公私钥签名模式

- app key、secret 模式

就像是 basic 验证时的用户名密码,secret 就是 digest 了。

因为服务端吗,不经过复杂的链路。也不需要啥安全的。

- 公私钥签名模式

还有一种就是 A 用私钥进行签名,
B 用公钥进行验签。


▎两种类型

平时,我们一个系统里,会有用户和平台两种角色

用户只能看到自己的数据,而平台可以看到整体的数据。

平台 != Admin

> 用户角色的 API

而用户,根据角色不同,又分为

  • 用户
  • 商家
  • 客服/管理员

其各自有着不同的功能和权限。通常我们会用不同的域来对其做区分:

  • /uv1
  • /mkv1
  • /admv1

▎授权模型

根据用户的角色,对应其可以使用的授权模型:

User Maker Admin APP
ServerSide Y Y Y Y
ClientSide Y Y Y /
OAuth 2.0 Y / / /

▎谈谈 APP 授权

> 使用及场景

似乎不常见哪个平台,对自己平台数据有开放 API 的,这些都是内部关键数据。

都是自己的人员,比如说微服务中的同公司其它服务,也就是说这里不用对权限做太多的限制?

> app 的权限范围

如果不设计权限范围的话,那不就乱来了?

app 关联到同户,不然找不到人

> 归属权

  • 归属到一个用户
  • 一个组织

如果是关联到用户下面,那这和用户的自己的 token,除了权限上的不同,其它都一致了。

> 申请流程

这个应该不能申请,只能后台批。

> auth 定义

app 是关连到用户,还是组织?

表名:tokens / authkeys

字段:

  • user_id
  • scope
  • session_id
  • private_key

▎JWT - ServerSide 公私钥签名模式

1
2
3
4
5
type MyJWTClaims struct {
jwt.StandardClaims
AppID string `json:"appid,omitempty"` // appid: appid
Mode string `json:"mode,omitempty"` // mode: Side
}

通过 mode 字段标识是一个服务端对服务端的 token

> JWT 定义

jti - serverside 用,表示一次性,uuid
iss - serverside 用,表示是谁,用户是谁
sid - serverside 用,给谁

uid - clientside 用,表示谁

app 模式

iss - ????
jti - 一次性
sid - 表示 app 要用的 key

app 是谁呢?要标识吗?


▎REF::