前言


注意,本文不介绍Rust/Tauri/OAuth相关概念!!

由于最近和朋友打算一起写一款ToDo-List软件,其中有一个需求是减少用户对账号密码的管理,比如我就特别讨厌每用一个软件都需要记一个密码。而且密码还最好与之前的密码不重复,所以对接一个OAuth系统就显得非常必要了。

解决思路


首先我们知道OAuth这类认证都有一个重定向地址,当你完成登录操作后会重定向到你指定的url中。而我们是桌面端无法提供一个url给OAuth完成认证的。

那么如何解决这个问题呢,其实很简单,参考主流软件都可以得到一个简单的思路,利用服务器构造一个可以访问的页面当作回调地址,得到OAuth的Code后将其返回给应用端。但这里引入了第二个问题,网页返回的内容如何传递给应用端,其实也很简单,不要整花里胡哨的东西,就给应用端塞一个web服务端功能就好了。

注意:OAuth返回的结果要么是json,要么是路径参数,但是它是以页面形式返回的。无法和正常接口一样利用js获取到,所以我们这里需要引入一个web服务端功能

这里我采用的是一款优秀的web库,Salvo库。Salvo 构建于 tokio 和 hyper 之上. 仅仅需要 Rust 基础知识即可开发功能强大的后端服务。

整体流程如下所示:

  1. 应用端通过Shell唤起默认浏览器打开认证地址
  2. 认证完后通过重定向地址重定向到我们构造在云服务器上的网页
  3. 该网页得到OAuth的code后,通过ajax或axios等请求我们tauri程序自带的服务端接口
  4. 本地服务端得到OAuth的code后,通过tauri的emit函数通知js代码继续后续操作
  5. 最后提示用户可以关闭授权的网页了

注意: 上述步骤使用默认浏览器是为了方便例如github这类OAuth登录的,因为如果默认浏览器登录过就无需再次登录了。

写在最后


本文的最大问题是无法关闭通过Shell打开的浏览器页面,使用window.close()函数会提示Scripts may close only the windows that were opened by them.,如果你有更好的办法,可以留言互相学习一下。