George Reese在文中概括了他认为REST API Authentication所应该遵循的3条原则:
1. All REST API calls must take place over HTTPS with a certificate signed by a trusted CA. All clients must validate the certificate before interacting with the server.
译:所有REST API请求都必须通过加密的HTTPS协议来传递,加密所用的证书应由一个trusted CA (certificate authority)签发。所有客户端必须验证服务器端的身份证书,然后才开始进行会话。
关 于这点我想应该是毫无疑义的。所有客户端和服务器端的通信内容应该都要通过加密通道(HTTPS)传输,明文的HTTP通道将会是man-in-the- middle及其各种变种攻击的温床。所谓man-in-the-middle攻击简单讲就是指恶意的黑客可以在客户端和服务器端的明文通信通道上做手 脚,黑客可以监听通信内容,偷取机密信息,甚至可以篡改通信内容,而通过注入RSA公匙加密后的通信内容理论上是无法被破译的(除非对应的private key被偷了…)。George很幽默地说道:如果你没有对你的API调用请求加密,你甚至没有在假装很安全。
不 过另外有一点经常被忽略的就是:即使使用了加密的HTTPS协议,客户端也必须对服务器端的身份进行验证。每当说到身份验证 (Authentication),人们总是先想到服务器端对客户端进行的身份验证(以确定你是哪个用户),但其实反向的客户端对服务器端的验证也是极为 重要的。在这个飞贼横行,假冒遍地的年代,你怎么知道为你提供服务的对象真的是你所指定的服务器呢?一个简单的spoof,或者被恶意篡改过的hosts 文件,都可能让你在不知不觉中把各种机密信息心甘情愿地交给躲在暗处的偷儿。但请注意我这里并不是说我们用的authentication模式一定是传统 意义上基于电子证书的Mutual SSL Authenatication,因为客户端不一定会拥有或使用独立电子证书,事实了,基于经济成本的考虑,大多数end-user并没有由一个 trusted CA发布的电子证书(这玩意儿可不是太便宜,至少大多数情况下是这样,嗯,当然有些例外,比如GoDaddy这种的,记得那时10美元就可以搞一个, 汗…)
2. All REST API calls should occur through dedicated API keys consisting of an identifying component and a shared, private secret. Systems must allow a given customer to have multiple active API keys and de-activate individual keys easily.
译:所有 REST API必须由专门的API密匙来验证。API密匙(注意:这里的密匙是广义的,不一定是指public key authentication中的key)必须有一个身份确认段,以及一个客户端/服务器端共享的私有秘密。服务器端的系统必须允许每个用户拥有一个或多 个API密匙,并且可以方便地禁用某些密匙(使之不再有效)。
这段话可能是文中写的最模糊的内容,我还是结合我们当年设计的方案来解释一下吧:
我 们当年提供的客户端验证手段主要是基于mutual ssl(如果客户拥有自己的电子证书的话)和我们自己设计的一种authentication token。客户可以随时向我们申请任意个authentication token,我们会通过一个HTTPS通道将authentication token发送给客户,客户拿到token以后应该妥善保存,不应该和任何人分享(因为这是他们的身份证明,如果别人知道了,就可以冒充他们了)。之后, 在客户向我们递交请求时(同样还是在一个HTTPS通道上),他必须同时递交一个authentication token来证明他的身份,我们在服务器端会进行验证。
Authentication token的设计大致是这样的:
AuthenticationToken = RealmString “:” TimeStamp “:”Domain “:”SignedPackage
而 其中最关键的SignedPackage是这样定义的:Base64(S(Gpri, RealmString + “:” + TimeStamp + “:” + DNS + OwnerPUID)),其中,Gpri是我们的private key,S代表签名操作,而Base64就是Base64编码。也就是说,SignedPackage是这样生成的:先取得这个字符 串:RealmString + “:” + TimeStamp + “:” + DNS + OwnerPUID,然后用我们的private key对该字符串进行签名加密,最后用Base64编码一下(这个只是为了HTTP协议传输的需要,和安全性无关)。
对照George Reese的文章,就可以看出,他所谓的identifying component在我们的设计中就是DNS部分,而shared, private secret就是整个SignedPackage部分。请注意AuthenticationToken中的TimeStamp部分,也就是说,客户在不同 时刻申请的token都会是不同的,所以这使得用户可以拥有多个token。而我们在服务器端也用很简单的机制可以revoke任何已经发出的 token。
最后可能有人要问这里的OwnerPUID是干什么的,这个其实是我们服务中的一个特殊的设计,和我们所提供的服务细节有关,这里就先不讨论了,也许下次有机会。
3. All REST queries must be authenticated by signing the query parameters sorted in lower-case, alphabetical order using the private credential as the signing token. Signing should occur before URL encoding the query string.
所有REST的查询请求都必须经过验证,验证的方式是客户端需对所有查询参数以小写字母顺序排序后用上文所提到的shared, private secret进行签名加密。签名加密的步骤应该在对查询字符串进行URL编码之前执行。
Ok, 这点是我不敢苟同的。对于查询字串加密会造成很多问题:比如所有的代理服务器的功能都无效了,比如服务器端缓存就无法实现了,最搞笑的是用户如果想把某个REST查询在Facebook上分享给朋友都不可能了。
其 实最最重要的是我觉得要求在REST查询的URL上夹带authentication信息是对REST原则的一种违反。我不敢说我完全理解Roy Fielding大师论文的真义,但我觉得REST协议的一个基本原则就是低耦合,也就是专项专用。URL就是用来决定resource的位置的,而不应 该也不必要再夹带其他功能,比如身份验证。身份验证的信息完全可以通过其他标准的HTTP协议的组件来实现(比如最简单的Authorization请求 报头 – request header)。
- 浏览: 8606 次
- 性别:
- 来自: 深圳
最新评论
-
it1788:
非常不错,膜拜楼主ing... 比神只矮了5cm弱弱的问 ...
NetBeans平台主导swing,实例项目:多资源下载平台 -
lijiaji_hy:
kbyst 写道感谢楼主分享
问个问题 为什么svn上che ...
NetBeans平台主导swing,实例项目:多资源下载平台 -
hantsy:
lijiaji_hy 写道将代码与表示层完全分开这个好像是个理 ...
NetBeans平台主导swing,实例项目:多资源下载平台 -
middin:
真是个好工具,
不知道这个工具是不是也支持windows系统了 ...
NetBeans平台主导swing,实例项目:多资源下载平台 -
kbyst:
感谢楼主分享问个问题 为什么svn上check不下来呢?co ...
NetBeans平台主导swing,实例项目:多资源下载平台
相关推荐
默认情况下,使用 HTTPS 进行身份验证。 Topology REST API 可以提供以下服务: * 检测拓扑结构:通过 GET 方法来检测网络拓扑结构。 * 检测用户配置连接列表:通过 GET 方法来检测用户配置连接列表。 * 添加用户...
身份验证 REST API 服务是现代 Web 应用程序和移动应用中的关键组件,它确保了只有经过授权的用户才能访问受保护的资源。本服务基于 Python 的 Django Rest Framework (DRF) 实现,并结合了 SimpleJWT 库进行令牌...
当您想通过Spring Security扩展Firebase的身份验证机制以无缝创建和使用受保护的rest API时,此Spring Boot Starter非常适合此类情况。 组态 请确保全局添加以下环境变量或项目特定的运行配置环境变量GOOGLE_...
具有内置Rest API身份验证的ES6 / 7 Node入门套件 产品特点 Babel配置 Nodemon自动重启开发服务器 生产环境配置 内置REST API身份验证 MongoDB配置 使用Airbnb eslint配置进行整理 预习 入门 克隆回购 git clone ...
REST API身份验证Rails-JWT V1.0描述该存储库是具有Rails,JWT,PostgreSQL等的应用程序软件安装使用Ruby 2.7时,最好使用Rails 6.0。软件Ruby版本管理器RVM 1.29.10-next数据库使用PostgreSQL应用客户休息:邮递员...
发出任何请求之前,请确保您已通过身份验证。 用于认证用户的路由是/auth/ 。 下面是显示如何验证用户身份的示例。 import json import requests import sys AUTH_URL = 'http://localhost:8069/auth/' headers = ...
具有REST API身份验证的Express和mongodb应用程序的样板 产品特点 与 用法 安装依赖 $ npm install 使用以下变量添加.env文件 DB_CONNECT = # the address for your mongodb database TOKEN_SECRET = # random ...
- **Basic Authentication**:最简单的认证方式之一,使用Base64编码的用户名和密码进行身份验证。 - **实现方式**:通过Spring Security配置类中的`http.authorizeRequests()`方法进行配置。 #### 3.3 摘要认证 -...
本文将深入探讨如何在WP REST API中实现有效的身份验证。 ### 一、WP REST API基础 WP REST API是WordPress核心的一部分,它提供了对网站内容的JSON格式的访问接口,包括文章、页面、用户、分类等。API由多个端点...
每个API都需要身份验证,但是没有开发人员希望处理身份验证。 简单身份验证将身份验证嵌入到API中,因此您无需进行处理。 最重要的是,它可以与传统Xamarin和Xamarin一起很好地工作。 Android: iOS / MacOS: ...
在本项目中,我们主要探讨的是如何利用Node.js构建一个基于REST API的系统,并结合MongoDB数据库以及JSON Web Tokens(JWT)实现用户的身份验证和授权。以下是对该项目中涉及的关键技术点的详细解释: 1. **Node.js...
安全身份验证API 注册/创建新用途 您可以通过向req.body中的注册URI发送HTTP POST请求(包括必要的详细信息)来注册用户,如下所示: 要求 POST / api / auth / signup req.body = {用户名,电子邮件,密码,...
node-express-mongoose-passport-jwt-rest-api-auth 此源代码是教程的一部分 在运行此示例之前,请确保已安装并运行MongoDB。 在本地运行的步骤: 克隆此仓库 运行“ npm install” 运行“ npm start” 如果您...
该存储库是一个模板,可避免重写使用Express.js,MongoDB构建的REST API的所有基本身份验证代码。 目录 为什么这个模板 该存储库包括启动MEAN / MERN堆栈后端所需的所有基本内容的设置 环境设置 连接数据库...
以上内容涵盖了构建RESTful API的关键方面,包括使用Spring框架进行Web应用的初始化、REST API的设计与实现、安全性考虑以及高级主题如分页、错误处理和版本控制等。这些知识点不仅适用于Spring 4,也适用于后续版本...
一个围绕Atlassian Crowd REST API的简单包装,用于针对Crowd服务器进行身份验证。 在做了 <groupId>com.fatboyindustrial.crowd-control</groupId> <artifactId>crowd-control <version>0.3.0 如何使用 ...
"restapi:具有完整身份验证功能的Bolierplate Restful API"是一个基于JavaScript实现的模板项目,为开发人员提供了一个起点,帮助他们快速搭建带有身份验证功能的RESTful API服务器。 在RESTful API的设计中,身份...
综上所述,这个项目利用Spring Boot的便捷性和Sureness的灵活性,构建了一个面向REST API的无状态认证系统,实现了用户身份验证和权限控制。通过JWT令牌进行认证,同时结合OAuth2或其他授权策略,为API提供安全的...
身份验证API 使用和一组简单的身份验证API 使用ES6 module创建以及import /export 。 要安装所有依赖项,请使用npm 。 后端是使用 , 。 加密密码 。 但是,所有用户都存储在JSON文件中。 为了简单起见,没有使用...
《自定义WordPress REST API助手:JWT身份验证与扩展REST API端点》 WordPress REST API是现代Web开发中不可或缺的一部分,它允许开发者通过JSON格式轻松地与WordPress网站进行交互。然而,尽管默认的Endpoints和...