codecamp

Joomla Web services API规范

从Joomla 4 开始,joomla正式从核心开始支持web service API接口,本文将简单的介绍一下API体系的规范。(可能会随着joomla的版本升级会有少许修改)

认证(Authentication)

Joomla核心已经内置了API的认证插件(API Authentication - Joomla Token插件和User - Joomla Token插件),系统的认证插件并没有完全按照oAuth 2规范来实现。(如果有需要,第三方开发者可以自己通过插件来实现)内置身份验证插件使用Bearer Token来实现。系统提供了一个新的插件组(api-authentication),开发者可以基于自己的需求来开发认证规范。

HMAC(Keyed-Hashing for Message Authentication) 是Joomla的 Bearer token实现的主要安全保证, 基于RFC 2104 HMAC规则生成的一个种子数据作为joomla网站的安全密钥(这个密钥$secret保存在configuration.php文件中) .经过base64编码的种子存储在数据库的用户配置表中。

基于这种格式(算法:用户ID:HMAC)得到一个字符串,然后将这个字符串经过base64 编码后就生成了令牌。其中算法告诉我们使用哪个加密哈希函数来生成 HMAC,根据 RFC 6151 的安全规范,系统禁止使用不太安全的加密哈希函数,事实上,当前的实现只允许 SHA-256 和 SHA-512,其中 SHA-256 是用于生成显示给用户的令牌的(硬编码)方法。 添加 SHA-512 是为了向前兼容。

出于安全和隐私原因,用户只能查看自己的令牌,即使他们是超级用户。具有 com_users.edit 权限的用户还可以禁用、启用或重置其他用户的令牌,但他们仍然无法查看.用户还可以选择禁用自己的 API 密钥。

Bearer Token是目前主流的访问权限控制/认证模式。

Bearer Token(Token 令牌)定义

:为了验证使用者的身份,需要客户端向服务器端提供一个可靠的验证信息,称为Token,这个token通常由Json数据格式组成,通过hash散列算法生成一个字符串,所以称为Json Web Token(Json表示令牌的原始值是一个Json格式的数据,web表示是在互联网传播的,token表示令牌,简称JWT)

请求(Requests)

内容协商

默认情况下,当使用 Accept: application/json 标头以及特定的 JSON API 标头请求时,Joomla 将返回 JSON API 响应。通过开发插件,也可以使Joomla 支持其他内容类型的能力,添加此映射的系统插件将负责确保组件支持此映射,joomla核心不支持其他的内容类型。

语言协商

目前不支持语言协商,以后可能会添加支持。

路由

基本信息

Joomla CMS 需要为 API 使用单独的路由器,因为 API 将是严格的 RESTful(即对同一个 URL 的 POST 和 GET 请求会产生不同的结果),Joomla 框架路由器已经满足了RESTFUL规范,然后将对其的请求映射到 JInput 变量,这样我们可以继续使用 JInput 来获得请求的参数。

由于 Joomla 的 API实现在Joomla 的 api 文件夹中,因此所有路由都将以 Joomla根目录/api  开头,这是不可以改变的,除非在joomla框架层面进行修改。

添加路由

路由通过类型为 webservice 的插件注册,一个插件可以添加一个或多个路由(每个都应该满足 RESTful 规范),虽然每个插件一个路由只添加一种路由最好,但是这样会导致系统安装非常多的插件,不利于开发管理。因此,我们建议每个组件使用一个插件来公开其接口数据。

响应(Responses)

API 响应格式

Joomla 评估了几种响应 API 格式,其中包括JSON-LD, JSON API 和 Collection+JSON。最终决定使用 JSON API v1.0 规范。Joomla API 中的一些批处理交互也将使用 JSON API Partial Success 模块进行错误处理。

 

Richardson 成熟度模型和超媒体

我们预计Joomla 将在很大程度上符合理查森成熟度模型的第 3 级,目前我们的实体系统(JTable 和 JModel)并不理想地适用于此,这意味着在某些地方,尤其是围绕数据关系的地方,可能存在一些实现困难


Joomla 系统事件
Joomla 路由系统
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

处理URL请求参数

Joomla 错误和调试

Joomla 缓存

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }