本文由赞助 感谢您支持使SitePoint成为鈳能的赞助商。
Syncano为实时应用程序提供了基于云的平台 它存储数据,微服务代码用于自动执行代码的时间表,用户帐户通过HTTP访问这些功能的网络钩子等等。 他们甚至拥有代码段的开源社区并支持各种运行时环境,包括NodePython,Go和Ruby
从开发人员的角度来看,Syncano通过提供许多您鈳能需要自己拼凑的后端基础架构使入门变得更简单。 在本文中我们将研究使用Syncano设置网络应用并将其链接到第三方服务所涉及的内容。
为了能够按照本教程进行操作对HTML,CSS和JavaScript的基础知识将非常方便
在演示应用程序中,我们使用jQuery组合了一些简单的原型屏幕和动作 我想強调一点–在正确的应用程序中,您确实应该使用一种更加可靠和简洁的方法来构建Web应用程序 我建议使用JavaScript框架,例如ReactAngular,Meteor…等在此演礻中,我们有目的地避免使用诸如JavaScript这样JavaScript框架来使事情保持简单并专注于Syncano的所有方面。 请阅读我们的Syncano功能片段并使前端JavaScript适应您自己喜欢嘚框架!
为了从初学者的角度探讨Syncano的功能,我们将构建一个Web应用程序它将以每月1美元的低价每天向注册用户发送肯定的肯定! 我们将探討用户注册,安排事件通过Twilio发送SMS消息以及设置付款方式。
该演示的代码都可以在上
如果您没有Syncano帐户,则可以在免费 您会在右上方找箌“注册”按钮:
填写您的电子邮件地址和首选密码,然后单击“创建我的帐户”:
注册后您将可以访问Syncano仪表板。 您可以随时通过转到 登录后,您将拥有一个“实例”我们将用它来演示应用程序。 如果您已经在使用Syncano并想创建一个新的请单击右下角的“ +”图标(请注意,除非使用实例的 否则您不能给该实例指定自定义名称,但是这超出了范围这篇文章!):
单击该实例将其打开 开始时会显得很空虛,左边有很多选择 您要做的第一件事是单击“ API密钥”菜单选项以获取您的API密钥:
然后通过单击“生成API密钥”为该实例生成API密钥:
Syncano将为您提供一个弹出窗口以提供API密钥设置。 您可以更新三个设置:
输入所有这些设置後,单击“确认”:
现在您应该看到列出了您的API密钥,并将该密钥复制到某个地方以备您在代码中使用它时使用。 如果您丢失了它呮需回到仪表板中的“ API密钥”页面即可:
为了在Syncano中进行一些调用,您将需要生成一个API密钥 我们可以通过“帐户”屏幕來做到这一点。 要到达那里我们将单击右上角的个人资料图片,然后单击包含我们电子邮件的区域以转到“帐户”屏幕:
在此处我们單击左侧菜单中的“身份验证”项,然后单击“复制”以复制显示的帐户密钥 现在将其存储在安全的地方!
我们将尽可能尝试使用API??密钥,特别是在Syncano生态系统之外的任何地方
Syncano提供了多种方法可以将其JavaScript库包含到您的应用程序中:
此功能的开头包含我们之前使用的Stripe键, locale
设置为以用户的本地语言弹出(很好的触摸) panelLabel
更改了付款按钮将在其信用卡详细信息表格下方显示的内容(我们希望它说“订阅”),我們将通过email
从他们的Syncano帐户中传递我们已经知道的电子邮件地址以便预先填写:
当条纹有用户的详细信息,该token
功能运行和我们发送的令牌和電子邮件给我们Syncano网络挂接称为subscribecustomer
这会将它们传递到我们的CodeBox上,以在我们的实际订阅过程中使用
完成该POST请求后,我们将设置本地JavaScript变量以便我们知道当前用户已经付款,并且知道他们的Syncano用户ID数据条ID和订阅ID。 然后我们运行一个功能,将用户带到应用程序的“我的帐户”页媔该页面将检查详细信息,现在告诉他们已订阅 请记住,您可以(并且应该)使用自己选择的框架来做得更好
为了实际触发该Stripe Checkout处理程序,我们有一个简单的handler.open()
函数该函数触发Stripe弹出窗口以请求付款详细信息:
如果他们单击导致Stripe触发popstate
事件的弹出窗口部分,则弹出窗口关闭:
要取消订阅客户我们会简化订阅过程。 我们不需要Stripe最初获取客户的详细信息或类似的信息因为我们已经获得了他们的Stripe ID和Stripe订阅ID。 相反我们需要的是一个CodeBox,它可以使用这些详细信息并告诉Stripe取消订阅此用户 我们将创建一个名为“ Stripe Unsubscribe Customer”的代码框。
在“ Stripe取消订阅客户”代码框Φ我们具有与“ Stripe订阅客户”代码框相同类型的require
语句。 我们接受当前用户的Syncano ID以及其Stripe
此CodeBox中唯一看起来可能与我们已经完成的工作不同的地方昰stripe.customers.cancelSubscription()
这是我们对Stripe的调用,以取消该用户的订阅 我们传入Stripe ID和Stripe订阅ID,然后在成功回调中对自己的数据库进行更改。
现在我们可以接受客户叻我们要开始运作的最后一件事就是预定的确认。 我们准备好了名为“计划确认”的CodeBox我们只需要将其设置为计时器即可。
转到“任务”页面单击带有图标的圆形按钮,该图标看起来有点像右下角的计时器 在出现的弹出窗口中,为您的日程安排选择一个名称选择“ Schedled Affirmation”作为我们要安排的代码框,并选择您希望其运行的频率(目前它出现在每天午夜一次唯一的选择–尚无一种设置时区的方法,因此这對每个人来说都不是午夜! 单击“确认”您的日程安排将自动运行!
在我们的演示前端JavaScript中,我们通过一个相当粗糙的goToPage()
函数来管理页面僦像您在上面偶尔看到的那样。 我们将避免详细解释所有工作原理因为您应该代替自己实现自己喜欢的适当框架!
最后一个重要的注意倳项,在我们观看演示之前:
在一个实时站点上当您收集非常敏感的信息时,您将希望通过HTTPS运行此应用程序!
我们单击注册然后输入峩们的详细信息(请确保您输入了自己的有效电话号码,否则此测试不会太令人兴奋!):
如预期的那样我们将提示您注册该服务的订閱:
当我们单击“ Subscribe”时,出现“ Stripe Checkout”弹出窗口要求您提供付款详细信息。 Stripe的测试信用卡号之一是42 4242
这是我在下面使用的。 您可以找到的
訂阅成功后,页面将更改为显示该页面并提供一个取消订阅选项(以及一个简单的注销选项该选项仅清除存储在JavaScript中的用户ID并返回首页):
如果我们转到Stripe仪表板,单击“计划”然后单击“确认计划”,我们将看到有关计划的详细信息 特别是,我们可以看到我们的新订户!
无需等待计划的确认运行我们可以打开“计划的确认”代码框,然后单击右侧的播放按钮立即运行它:
在很短的时间内您应该从您嘚应用收到一条短信:
如果我们随后决定退订,则单击退订并返回到上一个屏幕:
回顾Stripe,如果刷新页面我们将发现该订阅不再有任何訂阅者:
我们的应用程序运行良好!
如果由于某种原因您的应用无法正常运行,并且您想查看日志则可以通过打开CodeBox并单击“跟踪”选项鉲从CodeBox中找到日志。 然后单击您要从中查看日志的记录:
对于通过Webhooks运行的CodeBox您可以转至Webhooks页面并单击要查看其日志的Webhook来查找其日志:
Syncano是一个平囼,可以使将应用程序集成在一起的任务更加快捷易于管理。 它的代码框和解决方案的概念还鼓励将任务分成较小的块这可以使事情保持整洁和可重复使用。 如果您有正在考虑构建的原型应用程序为什么不尝试将其扔到Syncano中并试一下呢?
通过前面三篇文章你应该大致叻解了 Spring Security 的流程。你应该发现了真正的 login 请求是由 Spring Security 帮我们处理的,那么我们如何实现自定义表单登录呢比如添加一个验证码…
首先在上一篇文章的基础上,添加验证码功能
验证码的 Servlet 代码,大家无需关心其内部实现我也是百度直接捞了一个,直接复制即可
在原本的 Login 页面基础上加上验证码字段:
不要忘记在 WebSecurityConfig 中允许该 Url 的匿名访问,不然没有登录是没有办法访问的:
这样验证码就加好了运行下程序:
下面才算是这篇文章真正的部分。我们如何才能实现验证码验证呢思考一下,应该有以下几种实现方式:
使用 AJAX 方式验证和我们 Spring Security 框架就没有任何关系了,其实就是表单提交前先发个 HTTP 请求验证验证码本篇不再赘述。
使用过滤器的思路是:在 Spring Security 处理登录验证请求前验证验证码,如果正确放行;如果不正确,调到异常
茬逻辑处理中从 request 中取出验证码,并进行验证如果验证成功,放行;验证失败手动生成异常。
注:这里的异常设置在上一篇已经说过了:
现在来测试下当验证码错误后:
使用过滤器就已经实现了验证码功能,但其实它和 AJAX 验证差别不大
AJAX 是在提交前发一个请求,请求返回荿功就提交否则不提交;
过滤器是先验证验证码,验证成功就让 Spring Security 验证用户名和密码;验证失败则产生异常·。
如果我们要做的需求是鼡户登录是需要多个验证字段,不单单是用户名和密码那么使用过滤器会让逻辑变得复杂,这时候可以考虑自定义 Spring Security 的验证逻辑了…
在这個方法中我们将前台 form 表单中的 verifyCode
获取到,并通过 get 方法方便被调用