Koi技术教程-Tauri基础教程-第二节 Tauri的核心概念下
1 “你日渐平庸,甘于平庸,将继续平庸。”——《以自己喜欢的方式过一生》
2. “总是有人要赢的,那为什么不能是我呢?”——科比·布莱恩特
3. “你那么憎恨那些人,和他们斗了那么久,最终却要变得和他们一样,人世间没有任何理想值得以这样的沉沦作为代价。”——马尔克斯《百年孤独》
4. “如果结果不如你所愿,就在尘埃落定前奋力一搏。”——《夏目友人帐》
5. “人有逆天之时,天无绝人之路。”——《醒世恒言》
6. “有些事不是看到了希望才去坚持,而是因为坚持才会看到希望。”——《十宗罪》
7. “维持现状意味着空耗你的努力和生命。”——纪伯伦
第二节 Tauri的核心概念 下
前言
本章节阐述了Tauri技术中的核心概念内容,理解起来较为苦涩,但却为Taui应用的概念部分,了解这些概念后你将对Tauri的技术原理有一个较深的理解,为你后续开发应用和进行插件的开发奠定基础,初次理解较为困难,有一定的编语言程基础,可较为轻松,本章节分为上下2个部分,分别阐述了Tauri的五个核心部分
- 结构
- 进程模型
- App size
- IPC
- 安全
上部分介绍了Tauri的骨架结构、进程模型、应用大小配置,下部分介绍了Tauri的ipc(通信模型)和安全相关的概念和配置。
学习和理解建议:咋一看,若隐若现,再回眸,两不相识,重逢时,原是弹丸之丘!
推荐
Koi技术教程-Tauri基础教程-第二节 Tauri的核心概念 上
Koi技术教程-Tauri-第二章 Tauri的业务架构
Koi技术教程-Tauri-第三章 Tauri的搭建环境
接上一篇 Koi技术教程-Tauri基础教程-第二节 Tauri的核心概念 上 内容
五. IPC (inter-process communication)
Tauri使用IPC (进程间通信) 来实现前端和Rust后端之间的通信,确保了性能和安全性。
1. 概述
进程间通信 (IPC) 允许隔离进程安全地通信,是构建更复杂应用程序的关键。它包含以下2个部分:
- Brownfield Pattern
- isolation Pattern
消息传递是一种比共享内存或直接函数访问更安全的技术,因为接收方可以根据自己的需要自由拒绝或丢弃请求。例如,如果 Tauri Core 进程确定某个请求是恶意的,它就会直接丢弃该请求,而不会执行相应的函数。在Tauri 有两个IPC内容 -Events
和-。Commands
2. Events
事件是一次性的单向 IPC 消息,最适合用于传达生命周期事件和状态变化。与命令不同,事件可以由前端和Tauri Core发出。
3. Commands
Tauri 还在IPC 消息1之上提供了类似外部函数接口的抽象。主要 API类似于浏览器的API,允许前端调用 Rust 函数、传递参数和接收数据。invoke``fetch
因为该机制在底层使用类似 JSON-RPC 的协议来序列化请求和响应,所以所有参数和返回数据都必须可序列化为 JSON.
3. Brownfield Pattern
是使用 Tauri 最简单、最直接的模式,因为它试图尽可能与现有的前端项目兼容。
Brownfield 软件开发,可以了解下
由于 Brownfield 模式是默认模式,因此不需要设置配置选项。要明确设置它,您可以使用配置文件tauri > pattern
中的对象tauri.conf.json
。
{
"tauri": {
"pattern": {
"use": "brownfield"
}
}
}
4. isolation Pattern
隔离模式是一种在前端发送的 Tauri API 消息到达 Tauri Core 之前拦截和修改它们的方法,所有操作都使用 JavaScript。隔离模式注入的安全 JavaScript 代码称为隔离应用程序。
隔离模式的目的是为开发人员提供一种机制,帮助保护他们的应用程序免受对 Tauri Core 的不必要或恶意前端调用的影响。
工作原理
隔离模式就是在前端和 Tauri Core 之间注入一个安全的应用程序,以拦截和修改传入的 IPC 消息。它通过使用<iframes>
的沙盒功能与主前端应用程序一起安全地运行 JavaScript 来实现这一点。Tauri 在加载页面时强制执行隔离模式,强制所有对 Tauri Core 的 IPC 调用都首先通过沙盒隔离应用程序进行路由。一旦消息准备好传递给 Tauri Core,它就会使用浏览器的SubtleCrypto实现进行加密,然后传递回主前端应用程序。到达那里后,它会直接传递给 Tauri Core,然后像平常一样解密和读取。
为了确保某人无法手动读取应用程序特定版本的密钥并在加密后使用该密钥修改消息,每次运行应用程序时都会生成新密钥。
大致步骤如下:
- Tauri 的 IPC 处理程序收到一条消息
- IPC处理器 -> 隔离应用程序
[sandbox]
隔离应用程序钩子运行并可能修改消息[sandbox]
使用运行时生成的密钥通过 AES-GCM 加密消息[encrypted]
隔离应用程序 -> IPC 处理程序[encrypted]
IPC 处理程序 -> Tauri Core
缺点
- 由于信息经过加密,所以隔离模式相比 Brownfield 模式而言存在额外开销。除去性能敏感的应用 (使用很少依赖来提升性能的应用) 之外,使用 AES-GCM 算法来加解密 IPC 信息会对大部分应用造成相对较小的性能影响。
- Windows平台上,Webview限制了因为沙盒环境下加载
<iframe>
标签内的外部文件,Tauri在构建时实现一些步骤将脚本注入,但是ES Modules可能无法正常加载。
六. 安全 Security
信任边界是计算机科学和安全领域的一个术语,它描述了程序数据或执行改变其“信任”级别的边界,或者两个具有不同能力的主体交换数据或命令的边界
Tauri 的安全模型包含两个部分:
- 应用程序核心编写的 Rust 代码
- 用系统 WebView 理解的任何框架或语言编写的前端代码。
检查并严格定义边界间传递的所有数据对于防止信任边界违规非常重要。如果数据在这些边界间传递而没有访问控制,那么攻击者很容易提升和滥用特权。
IPC层是这两个信任组之间沟通的桥梁,确保边界不被破坏。
插件或应用程序核心执行的任何代码都可以完全访问所有可用的系统资源,并且不受限制。
1. 安全机制
1. 权限
权限是对命令的明确特权的描述。它可以使命令在 Tauri 应用程序的前端可访问。它可以将范围映射到命令并定义启用哪些命令。权限可以启用或拒绝某些命令、定义范围或将两者结合起来。
在Tauri的插件开发中应用。
2. 运行时权限
运行时权限是 Tauri Core 的一部分。它拥有运行时的所有权限、功能和范围,以强制执行哪个窗口可以访问哪个命令,并将范围传递给命令。
每当从 webview 调用 Tauri 命令时,运行时机构都会收到调用请求,确保来源被允许实际使用请求的命令,检查来源是否是功能的一部分,以及是否为命令定义了范围并且适用,然后将它们注入到调用请求中,然后传递给正确的 Tauri 命令。
如果不允许源调用该命令,则运行时权限将拒绝该请求,并且永远不会调用 Tauri 命令。
3. 功能
Tauri 为应用程序和插件开发人员提供了一个功能系统,以精细地启用和限制在系统 WebView 中运行的应用程序前端的核心暴露。
功能是一组通过相应标签映射到应用程序窗口和 Web 视图的权限。功能可以影响多个窗口和 Web 视图,并且可以在多个功能中引用这些窗口和 Web 视图。
功能文件在目录内定义为 JSON 或 TOML 文件src-tauri/capabilities
。
配置方式说明
-
默认情况下,capabilities 的配置是由 tauri.conf.json 中
{ "app": { "security": { "capabilities": ["my-capability", "main-capability"] } } }
capabilities 配置来制定的,它的默认值是 [], 代表:
src-tauri/capabilities
文件下的内容会全部加载。 -
内联配置方式,它可以和指定方式同时使用, src-tauri/tauri.conf.json 文件中
{ "app": { "security": { "capabilities": [ { "identifier": "my-capability", "description": "My application capability used for all windows", "windows": ["*"], "permissions": ["fs:default", "allow-home-read-extended"] }, "my-second-capability" ] } } }
指定权限的目标平台
通过定义数组,功能可以特定于平台。默认情况下,platforms
功能应用于所有目标,但您可以选择linux
、macOS
、和目标的子集。windows``iOS``android
如:src-tauri/capabilities/desktop.json
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "desktop-capability",
"windows": ["main"],
"platforms": ["linux", "macOS", "windows"],
"permissions": ["global-shortcut:allow-register"]
}
远程API 访问
默认情况下,只有 Tauri App 附带的捆绑代码才能访问 API。若要允许远程源访问某些 Tauri 命令,可以在功能配置文件中定义这一点"remote"。 src-tauri/capabilities/remote-tags.json
{
"$schema": "../gen/schemas/remote-schema.json",
"identifier": "remote-tag-capability",
"windows": ["main"],
"remote": {
"urls": ["https://*.tauri.app"]
},
"platforms": ["iOS", "android"],
"permissions": ["nfc:allow-scan", "barcode-scanner:allow-scan"]
}
Tauri 生成一个 JSON 模式,包含应用程序可用的所有权限,这样你就可以在 IDE 中实现自动补全。 要使用模式,请将
$schema
属性设置为capabilities/schemas
目录中的模式之一,这些模式是特定于平台的。 通常你会将其设置为../gen/schemas/desktop-schema.json
或../gen/schemas/mobile-schema.json
,不过你也可以为特定的目标平台定义功能。
4. 作用域/范围
范围是定义 Tauri 命令允许或禁止行为的一种细粒度的方法。分为allow
或deny
,其中deny
总是取代allow
范围。
在插件开发中,卡发人员需要定义插件命令的操作范围,确保不存在任何绕行的操作,范围的验证要在程序中实现。简单的理解就是插件需要一些操作方面的授权,这些授权信息在程序执行时需要确保是允许的。
范围定义在插件的开发中是比较重要的,概念需要理解。
2. 通用安全功能
1. 内容安全隔离(CSP)
Tauri会对本地的HTML页面强制使用内容安全策略,本地脚本经过哈希处理,同时样式、外部脚本经由加密随机字符串引用,防止禁止内容被加载;减少或防止跨站点脚本 (XSS) 等常见 Web 漏洞的影响。
仅在 Tauri 配置文件中设置后,CSP 保护才会启用。您应该尽可能地限制它,只允许 Webview 从您信任的主机(最好是您自己的主机)加载资产。在编译时,Tauri 会自动将其 nonces 和 hashes 附加到捆绑代码和资产的相关 CSP 属性中
配置内容如下:tauri/examples/api/src-tauri/tauri.conf.json
"csp": {
"default-src": "'self' customprotocol: asset:",
"connect-src": "ipc: http://ipc.localhost",
"font-src": ["https://fonts.gstatic.com"],
"img-src": "'self' asset: http://asset.localhost blob: data:",
"style-src": "'unsafe-inline' 'self' https://fonts.googleapis.com"
},
2. 进程隔离模式
参见IPC
3. Http Headers
此项内容在Tauri@2.1.0之后
配置信息仅限于:
- Access-Control-Allow-Credentials ↗
- Access-Control-Allow-Headers ↗
- Access-Control-Allow-Methods ↗
- Access-Control-Expose-Headers ↗
- Access-Control-Max-Age ↗
- Cross-Origin-Embedder-Policy ↗
- Cross-Origin-Opener-Policy ↗
- Cross-Origin-Resource-Policy ↗
- Permissions-Policy ↗
- Timing-Allow-Origin ↗
- X-Content-Type-Options ↗
- Tauri-Custom-Header
配置信息如下:src-tauri/tauri.conf.json
{
//...
"app":{
//...
"security": {
//...
"headers": {
"Cross-Origin-Opener-Policy": "same-origin",
"Cross-Origin-Embedder-Policy": "require-corp",
"Timing-Allow-Origin": [
"https://developer.mozilla.org",
"https://example.com",
],
"X-Content-Type-Options": null, // gets ignored
"Access-Control-Expose-Headers": "Tauri-Custom-Header",
"Tauri-Custom-Header": {
"key1": "'value1' 'value2'",
"key2": "'value3'"
}
},
// notice how the CSP is not defined under headers
"csp": "default-src 'self'; connect-src ipc: http://ipc.localhost",
}
}
}
注意:
Tauri-Custom-Header
不适用于生产用途。对于测试:请记住进行Access-Control-Expose-Headers
相应设置。
vite.config.ts 的配置修改vite.config.ts
import { defineConfig } from 'vite';
export default defineConfig({
// ...
server: {
// ...
headers: {
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'require-corp',
'Timing-Allow-Origin': 'https://developer.mozilla.org, https://example.com',
'Access-Control-Expose-Headers': 'Tauri-Custom-Header',
'Tauri-Custom-Header': "key1 'value1' 'value2'; key2 'value3'"
},
},
})