QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

RESTful API 认证模式

  • 2010-01-22
  • 本文字数:1071 字

    阅读完需:约 4 分钟

所有人都觉得编写客户化认证协议是有必要的”, George Reese 说,这也是他在使用云提供者和 SaaS 提供商们提供的 API 进行编程的过程中的领悟之一。在一篇博文中他提出了一组旨在适用于任何 REST 的认证需求的标准。

George 曾开发过各种各样的 Web 服务 API,他发现每一种 API 都需要一种特定的认证机制。

我已经疲于在这种事情上上浪费脑细胞了,比如某提供商 A 的要求是在 URL 编码之前或之后为查询字符串进行签名。我也早已厌倦了提供商们诸如要求使用用交互用户的凭证进行 API 调用的这样的认证要求了。

他勾勒了 REST API 的认证机制的设计规则。他说,“让我们变得简单些:如果你不加密 API 调用,你甚至连假装安全都做不到”。

1。 所有的 REST API 调用必须运行在使用可信的 CA 签名过的证书的 HTTPS 之上。所有客户端与服务端交互之间必须要验证服务端证书。

通过使用由可信机构签名的证书,SSL 可以保护你免受“中间人”攻击。中间人攻击的手段是在客户端和服务端之间插入一个代理进而窃听“加密的”通信。

如果你不验证服务端的 SSL 证书,你就无法知道谁在接收你的 REST 查询请求。

2。所有的 REST API 调用应该通过专门的 API 密钥完成,该密钥由标识成分和共享密钥两部分组成。系统必须允许一个指定客户端拥有多个活动的 API 密钥并能方便地让个别密钥失效。

前半部分的重点是发起 REST 请求的系统不应是某个交互用户……REST 认证的的是程序而不是人,它支持比人使用的用户名 / 密码更强大的认证手段。

后半部分的意思是,每个 REST 服务器应该支持每个客户端拥有多个 API 密钥。该需求使得孤立潜在危害和当危害发生时解决问题更为简单。[…] 当应用被破坏时,你也需要一种完善的方式铺开替换的 API 密钥。

3. 所有的 REST 查询必须通过签名令牌签名的方式进行认证,该过程通过对按小写的字母顺序排序的查询参数使用私钥进行签名。签名应在查询字符串的 URL 编码前完成。

换言之,你不能将共享密钥作为查询串的一部分进行传递,而应使用它进行签名。签名后的查询串看起来应该是这样的:

GET /object?timestamp=1261496500&apiKey=Qwerty2010&signature=abcdef0123456789

被签名的串是“ “/object?apikey=Qwerty2010&timestamp=1261496500” ”,而签名是应用 API 密钥的私钥所得到的 HMAC-SHA256 哈希值。

他承认在大部分类 REST 的 RESTFul API 方案中,认证几乎肯定被看作是次要的问题。然而,在文章的结论中他建议读者“最好参照别人的例子,而不应自创认证模式”。

InfoQ 的读者们,请别吝惜你的意见。最初的博文地址是: O’Rielly 社区博客.


查看英文原文: RESTful API Authentication Schemes

2010-01-22 10:3525451
用户头像

发布了 184 篇内容, 共 80.7 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

云原生(三十五) | Prometheus入门和安装

Lansonli

云原生 k8s 9月月更

深入思考Schema管理的几个基本问题

HackMSF

完美!华为大佬手码20w字Redis全栈小册,原来Redis性能可压榨到极致

Java全栈架构师

数据库 redis 程序员 面试 后端

如何成为资深的测试专家

穿过生命散发芬芳

测试 9月月更

日拱算法:什么是“情感丰富的文字”?

掘金安东尼

9月月更

都2022年了,Python Web框架你不会只知道Django和Flask吧?

梦想橡皮擦

Python 9月月更

Spring源码分析(七)扩展接口BeanPostProcessors源码分析

石臻臻的杂货铺

spring 9月月更

Spring源码分析(八)Spring 所有BeanFactoryPostProcessor扩展接口

石臻臻的杂货铺

spring

【精通内核】CPU控制并发原理CPU的中断控制

小明Java问道之路

Linux cpu Linux内核 汇编语言 9月月更

LeetCode二分查找使用JavaScript解题,前端学算法

大师兄

JavaScript 面试 算法 LeetCode 9月月更

在互联网,摸爬滚打了几年,我悟了。面对如今经济形势,普通打工人如何应对?

HullQin

Go golang 后端 websocket 9月月更

npm run 脚本背后的事情

汪子熙

node.js 开源 npm YARN 9月月更

记一次 swap 导致系统盘高 IOPS 问题排查

卫智雄

linux运维

【大话 C 语言】春眠不觉晓,函数知多少?

Albert Edison

递归 C语言 函数 开发语言 9月月更

挑战30天学完Python:Day1火力全开-初识Python(含系列大纲)

MegaQi

9月月更 挑战30天学完Python

架构实战营模块六作业

zhihai.tu

Java 键盘输入n个数进行排序输出

排序 java基础 9月月更

「知识点」PropTypes提供的验证器

叶一一

JavaScript 前端 9月月更

小六六学Netty系列之Java NIO(一)

自然

网络 9月月更 neety

如果你是Java程序员,你会选择Cloud Studio进行云端开发,放弃IDEA吗?

wljslmz

Java Cloud Studio 9月月更

C++学习------cerrno头文件的作用与源码学习

桑榆

c++ 9月月更

k8s自定义controller三部曲之三:编写controller代码

程序员欣宸

Kubernetes Controller 9月月更

Java问题解决录: 运行时抛出NoSuchMethodError / NoSuchFieldError异常

崔认知

在世界人工智能大会,看京东AI向产业奔涌

脑极体

2022-09-03:n块石头放置在二维平面中的一些整数坐标点上 每个坐标点上最多只能有一块石头 如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。 给你一个长度为 n 的数组

福大大架构师每日一题

算法 rust 福大大

三种获取URL参数值的方法

devpoint

JavaScript URL参数解析 9月月更

IO多路复用中的Select/poll/epoll总结全乎了

知识浅谈

IO多路复用 9月月更

常见的网络安全攻击及防御技术概述

阿泽🧸

网络安全 9月月更

PANAMA: 共享机器学习集群的网内聚合框架

俞凡

大数据 架构 网络

Kubernetes网络插件详解 - Calico篇 - 网络基础

巨子嘉

拆分电商系统为微服务

张立奎

RESTful API认证模式_SOA_Dilip Krishnan_InfoQ精选文章