分布式权限处理方案

方案一: 认证协议 JWT

JWT,全称是Json Web Token, 是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;它是分布式服务权限控制的标准解决方案!

JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

Header
Payload
Signature
因此,一个典型的JWT看起来是这个样子的:

  xxxxx.yyyyy.zzzzz

  Header header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)

  Payload JWT的第二部分是payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型: registered, public 和 private。

  Signature 签名是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。

JWT怎么使用?

  用户携带用户名和密码请求访问 -服务器校验用户凭据 -应用提供一个token给客户端 -客户端存储token,并且在随后的每一次请求中都带着它 -服务器校验token并返回数据。

  每一次请求都需要token -Token应该放在请求header中 -我们还需要将服务器设置为接受来自所有域的请求,用Access-Control-Allow-Origin: *。

 

方案二: 授权框架 OAuth2

  OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。......资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。

  OAuth 2.0 规定了四种获得令牌的流程: 

授权码(authorization-code)
隐藏式(implicit)
密码式(password):
客户端凭证(client credentials)
A 用户操作应用,B为请求的第三方获取token应用

1.授权码

用户通过该URL https://b.com/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read 获取授权码。
上面 URL 中,response_type参数表示要求返回授权码(code),client_id参数让 B 知道是谁在请求,redirect_uri参数是 B 接受或拒绝请求后的跳转网址,scope参数表示要求的授权范围(这里是只读)。
然后后端通过授权码获取token并返回前端 :
https://b.com/oauth/token? client_id=CLIENT_ID& client_secret=CLIENT_SECRET& grant_type=authorization_code& code=AUTHORIZATION_CODE& redirect_uri=CALLBACK_URL
上面 URL 中,client_id参数和client_secret参数用来让 B 确认 A 的身份(client_secret参数是保密的,因此只能在后端发请求),grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码,code参数是上一步拿到的授权码,redirect_uri参数是令牌颁发后的回调网址。

获取到token 后,就可以正常访问数据了。

2.隐藏式
这种是纯前端请求token,针对安全性要求不高的网站可以实用。
前端通过 https://b.com/oauth/authorize? response_type=token& client_id=CLIENT_ID& redirect_uri=CALLBACK_URL& scope=read 可以直接获取token。

3.密码式
这种一般是内部应用间跳转使用,直接通过用户的账号密码来获取token。
https://oauth.b.com/token? grant_type=password& username=USERNAME& password=PASSWORD& client_id=CLIENT_ID

4.客户端凭证
适用于没有前端的命令行应用,即在命令行下请求令牌。
https://oauth.b.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
上面 URL 中,grant_type参数等于client_credentials表示采用凭证式,client_id和client_secret用来让 B 确认 A 的身份。



 


  


posted on 2021-05-31 10:08  sui008  阅读(432)  评论(0编辑  收藏  举报

导航