Rest API的认证模式

Rest API的认证模式

微服务系统中,很多团队采用了API驱动设计开发,服务之间的调用都通过API来实现的。为了统一管理API,一般都会在前面部署一个API Gateway,然后由API Gateway对API的调用者进行权限认证。 常见的认证方式有下面几种:

  • AppKey
  • AppKey + Secret
  • JWT
  • OAuth

下面我们逐一来介绍这些App的认证方式,以及对应的使用场景.

AppKey

AppKey 是比较悠久,也是比较简单但是蛮有效的一种方式方法。当Application申请访问API后,API Gateway会为这个Application生成一个AppKey,一般是UUID等随机无意义的字符串。当Application调用API的时候,需要在Http Header或者是Query里面带上这个AppKey, 然后API Gateway进行校验,验证无误后方可访问到具体的API。 比如

GET http://api.example.com/users?AppKey=1234567890abcdef

或者是在header里面:

GET http://api.example.com/users
x-app-key=1234567890abcdef

不建议放在Query里面,这样很容易就被爆出来,因为即使是HTTPS连接,URL也是不会加密的。同时建议用RFC7235关于HTTP认证部分的标准,以Authorization header的方式进行连接:

GET http://api.example.com/users?AppKey=1234567890abcdef
Authorization: AppKey 1234567890abcdef

小结:AppKey简单明了,带着key直接就可以走了!如果只是为了能识别API的调用者,同时进行一些常规的API Gateway逻辑,AppKey也就够了。其实微软Azure API Management里面的subscription 就是直接用AppKey作为Header进行访问的。

AppKey + Secret

我们知道Hash算法可以能够完成密码学四大目标之一的完整性检验,但是不能避免消息被篡改:比如有人将内容以及Hash一起给改掉。为了避免消息被篡改,伟大的前人设计出消息验证码(Message Authentication Code), 在计算hash的时候,同时在里面加入密钥,得出基于Hash的消息验证码,常见的有HMAC (Hash-based Message Authentication Code).

现在我们要介绍的这种API的认证方式同时带上AppKey以及消息验证码的。当Application申请访问API后,API Gateway会为这个Application生成一对Key, 一个叫AppKey,另一个叫App Secret。 API Gateway保存这对Key/Secret. 当Application发起请求时,首先是在header带上这个AppKey,然后按照API Gateway的要求,对请求的URL, body, header等消息进行HMAC运算,并作为HTTP Header发送,最终发给服务器的内容大致如下:

POST ttp://api.example.com/users
Authorization: AppKey 1234567890abcdef
X-Ca-Signature: HMAC(HTTP Method+Headers+Body)

Body content

当API Gateway收到这个请求之后,它会取出这个AppKey对应的AppSecret,然后以相同的算法对请求的内容进行HMAC运算,将得出的摘要跟发过来的摘要比较。这里的摘要也有些地方叫 签名。

小结:这种方式虽然稍微复杂了点,但同时把身份确认以及消息不被篡改的要求都满足了。阿里云API Gateway的subscription就是采用这种方式。

JWT

如果AppKey泄露或者被截取,窃取方在Application发现AppKey泄露之前,是可以用Application的不受限地进行API的调用。那怎样才能最低程度地减少AppKey丢失之后的风险呢? 比如有效期缩短?

Json Web Token(缩写JWT) 是目前比较流行的跨域身份认证解决方案。以令牌的方式进行沟通,而令牌自身带着身份信息,并且具有时效性,过期无效。所以我们可以采用JWT来减少AppKey丢失之后的风险。

一个JWT包括3个部分:头部(算法以及类型),Payload(具体的内容,主要是有效时间,名字等) 以及签名。格式为 aaaa.bbbbb.cccc. 每一部分的内容都用Base64编码进行表示。

jwt.png
  • 首先Application在API Gateway注册的时候,API Gateway会返回一对ID/Secret。
  • 在Application调用API之前,先带上ID、Secret去调用API Gateway的Token接口,API Gateway 返回令牌
  • Application 把token放在Authorization header里面,去请求API
  • API Gateway验证JWT是否过期,签名是否合法,以及Payload里面的信息,如果合法就允许继续访问

如果Token别人截取了,那么窃取方只能在token过期之前这个时间段内 假扮成Application去调用API。

小结:JWT会使得口令丢失的损失减低一些,同时payload里面可以带更多的有用的信息(当然标准规范里面的payload也没有多少可定制的字段),可以进行一些相应的权限或者业务操作。

OAuth

OAuth是一个可以为第三方应用访问用户资源的安全框架。OAuth有4种不同的认证授权:

  • 授权码模式 - Authorization Code
  • 客户端凭据 - Client Credentials
  • 密码模式 - Password
  • 隐式授权 - Implicit

授权码模式跟隐式授权模式都是在有用户的场景下使用 (隐式授权模式没有授权码,而是直接获得access token),而密码模式则是直接要用户输入用户名密码的,一般都不用。客户端凭据 Client Credential 这种方式可以用来作为API 的认证授权。

具体的操作流程跟JWT的方式下类似:

  • 首先Application在API Gateway注册的时候,API Gateway会返回一对client Id / Secret。

  • 在Application调用API之前,先带上client Id / Secret去调用API Gateway的Access Token接口,API Gateway 返回Access Token.

  • Application 把Access Token放在header里面,Authorization: Bearer ACCESS_TOKEN 去请求API

  • API Gateway验证Access Token是否过期,签名是否合法,解开payload,检查是否该令牌是否有权限访问该资源,如果验证通过 则允许继续访问

小结: API Gateway 的龙头老大Google Apigee就是采用OAuth Client Credentials的方式进行Application的认证授权的,微软Azure的API Management除了上面说的subscription的方式,也支持了AAD OAuth的方式,不过过程比较繁琐。如果API Gateway除了需要身份认证之外,还需要进行权限的校验,那么以JWT作为Access Token的OAuth是一种值得一试的方案。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342