Server Side Swift入门:1.1

Turnstile SQLite演示

欢迎来到我的“ Server Side Swift入门”系列的第二部分。 在整个系列文章中,我将解释如何使用Perfect工具箱使用Server Side Siwft的各个不同方面进行入门和运行的基础知识。

本文演示了如何运行Turnstile SQLite演示并探索其Web路由和API,以及深入研究SQLite数据库并找出导致会话滴答的原因。

Turnstile是Stormpath构建的身份验证过程,其模仿Apache Shiro。 Perfect已将其作为该项目的身份验证选项之一,并带有SQLite,MySQL,CouchDB,PostgreSQL和MongoDB的驱动程序。

SQLite是一个出色的教学数据库工具,因为它基于文件,并且几乎不需要任何设置,并且所有Mac和大多数Linux系统都将SQLite作为标准配置。 但是,我不建议在大规模生产系统中使用它。

首先,如果您尚未获得Perfect Assistant应用程序,请访问https://www.perfect.org/en/assistant/以下载Perfect Assistant。

在“欢迎”屏幕上,单击“创建新项目”按钮。

这将滑落为两种项目类型的工作表。 在“示例”下,选择“完美:带有SQLite的旋转门”。

使用“浏览按钮”选择应用程序的位置-并根据需要创建一个新文件夹。 请注意,在Perfect Assistant中,“项目名称”是您选择的文件夹的名称。

取消选中“将Linux构建与Xcode项目集成”,因为在本演练中我们不会部署到Linux。

按下“保存”后,Perfect Assistant将继续创建项目,下载所有依赖项并创建Xcode项目文件。

完成后,您的项目也将列在左侧的“项目”列表中。 它向您显示了项目中已经存在的依赖关系-如果您没有看到自己认为应该存在的内容,请不要担心,子依赖关系也会自动包含在内。

从这里,您还可以在查找器或终端窗口中打开项目目录,然后打开Xcode项目。

在Xcode中,打开Sources目录,您将看到许多其他依赖项已自动添加到我们的项目中。 添加这些是因为它们是子依赖项。

在我们的项目源目录中是一个main.swift文件。

这包含用于运行演示的代码。 需要指出的几件事。

在第38行,我们在此处定义SQLite数据库文件的位置-SQLiteConnector.db属性设置为“ ./authdb”。

  SQLiteConnector.db =“ ./authdb” 

因为SQLite是基于文件的数据库,所以我们可以将文件放置在所需的任何位置,但是在这种情况下,我们告诉应用程序将其放置在运行时工作目录中。

您还将在项目浏览器中注意到,我们有一个名为“ webroot”的目录。 这是我们保留CSS,JavaScript和图像之类的静态资产以及胡子模板的地方,我们将在本系列的另一部分中介绍这些模板。

由于存在诸如SQLite数据库和webroot目录之类的文件,因此我们需要告诉Xcode在何处考虑“工作目录”。

在“方案”下拉列表中,确保选择“具有终端外观”的黑色图标,并确保目标是“我的Mac”。 现在,让我们选择“编辑方案”。

在“运行->选项”选项卡中,确保选中“工作目录”选项,然后单击文本输入区域中的“文件夹”图标并导航到项目的目录。 在这里,您将看到“ Sources”目录和“ webroot”。

现在可以运行项目-按下三角形的“运行”按钮,或在键盘上按下CMD-R。

构建完成后,Xcode将执行该应用程序,并在右下侧控制台视图中显示一条消息,表明它已在端口8181上启动HTTP服务器。

  [INFO]运行设置:用户 
[INFO]运行设置:令牌
[INFO]在0.0.0.0:8181上启动HTTP服务器

在本地主机端口8181的浏览器中,我们看到一个欢迎屏幕,要求我们登录,以及其他一些信息性链接。

单击“登录”链接…,但是我们尚未创建帐户,因此我们需要单击“注册”

输入用户名和密码。 提交后,您会看到它已返回,表明您有一个“ ID”,并且右上角现在显示“注销”。

看来我们已经创建了一个帐户,现在已经登录。

打开浏览器的开发人员工具。 在Safari中,可以通过按cmd-option-i来完成此操作。 单击“存储”和“ Cookies”。 您会看到我们有一个“ TurnstileSession” cookie,其值类似于下一个屏幕截图中所示:

让我们来看一下数据库。 切换到Perfect Assistant,然后单击“打开:项目目录”按钮。 在打开的查找器窗口中,您将看到一个名为“ authdb”的文件-这对应于我们在项目的main.swift中引用的文件。

回到Perfect Assistant中,单击“打开:项目终端”按钮。 这将启动终端,并将工作目录作为我们的项目。

打开SQLite数据库:

  sqlite3认证数据库 

看到sqlite提示后,我们可以看到带有以下内容的SQL模式:

  .schema 

它将向我们显示两个表,一个表包含用户,另一个表包含“令牌”。 这些令牌将浏览器会话与用户相关联。

  sqlite> .schema 
CREATE TABLE用户(唯一的TEXT PRIMARY KEY NOT NULL,用户名TEXT,密码TEXT,facebookID TEXT,googleID TEXT,名字TEXT,姓氏TEXT,电子邮件TEXT);
CREATE TABLE令牌(令牌TEXT PRIMARY KEY NOT NULL,用户ID TEXT,创建的INTEGER,更新的INTEGER,空闲的INTEGER);

要查看所有用户:

  sqlite> SELECT * FROM用户; 
  e-IsVfqBuiLLbOV4nVjVTQ | jono |  $ 2a $ 10 $ a8k9zRbg.vwZ1s / g48XwW.2KpEy1d3ucav6Twm5SNlP7y / IslvyVG ||||| 

您将看到一个非常简洁的行。 乍一看,这不是很容易理解的内容,但是您会注意到,第一行文本是注册后在浏览器中显示的用户ID。 然后是一个竖线字符(垂直线),然后是您的用户名。 就我而言,我只是输入“ jono”。 下一列是一堆奇怪的字符-这实际上是我们输入的密码,但已被加密。 我们绝不能将密码或其他敏感信息以纯文本格式存储在数据库中!

好的,现在让我们看一下“令牌”表中存储的内容。

  sqlite> SELECT * FROM令牌; 
  5_5-PL962Y7OciEOMnSA0g | e-IsVfqBuiLLbOV4nVjVTQ |  511061531 | 511061531 | 86400 

开头包含一个值,您希望它与我之前显示的cookie的值相同。 下一个值是用户表中的关联用户ID。 接下来是与创建的日期和时间,上次更新(或“触摸”)和会话空闲时间相对应的值。 如果现在与上次更新时间加上空闲时间之间的差大于零,则该会话被视为“过期”或“无效”。

因此,现在我们已经在浏览器中看到了会话cookie,并且在相同的值和您的用户ID之间存在关联,您可能会发现这确实是身份验证的方式。

会话只是您所有交互和服务器之间的链接。 每次浏览器或JSON API与服务器对话时,它通常以cookie的形式发送此会话ID。 然后,服务器可以知道应该将交互链接在一起-如果会话中有用户ID,则服务器可以传递用户特定的信息或特权。