系统安全设定
当用户中奖之后,系统会生成一个token,该token与uid的组合,是用来判断用户是否中奖的重要依据,这里可能涉及到一个问题:为什么有了uid,还要增加一个token来进行组合判断呢?
其实原因很简单的,提交中奖信息和查询中奖信息,如果是通过uid来直接进行处理的,那么很有可能会有用户通过遍历等手段,非法获取到其他用户提交过的信息,而这一部分信息很有可能涉及到用户提交的收货地址等。所以为了安全,增加了一个token,在一定程度上,提升了被暴力遍历的复杂度。而这一部分的方法也很简单:
@csrf_exempt def information(request): uid = request.GET.get("uid", None) token = request.GET.get("token", None) if None in [uid, token]: return JsonResponse({"Error": "Uid and token are required."}) userInfor = UserModel.objects.filter(uid=uid, token=token) if userInfor.count() == 0: return JsonResponse({"Error": "No information found yet."}) if not userInfor[0].result: return JsonResponse({"Error": "No winning information has been found yet."}) if request.method == "GET": return JsonResponse({ "Result": { "prize": userInfor[0].pre_prize, "name": userInfor[0].name, "phone": userInfor[0].phone, "address": userInfor[0].address } }) elif request.method == "POST": name = request.POST.get("name", None) phone = request.POST.get("phone", None) address = request.POST.get("address", None) if None in [name, phone, address]: return JsonResponse({"Error": "Name, phone and address are required."}) userInfor.update(name=name, phone=phone, address=address) return JsonResponse({"Result": "Saved successfully."})
整个流程是:
- 通过用户的uid和token进行相关用户信息的获取;
- 如果请求方法是 GET 方法,那么则直接返回用户的中奖信息(指的是收货信息);
- 如果请求方法是 POST 方法,则允许用户进行中奖信息的修改(指的是收货信息);
其他安全方面的补充:
- 如何保证用户的token等信息的唯一性以及不可伪造性,这一部分在浏览器端是不太容易实现的,因为用户可能换浏览器,但是对于用户的在函数计算平台的函数服务中就相对容易实现了,所以采用域名下发阶段,对指定时间段下发过的域名信息进行记录,再在后期进行对比,以保证用户确实通过 Serverless Devs 开发者工具进行了项目部署,下发了临时域名,并在规定的时间内参加了活动;(如果用户注册了多个阿里云账号,进行该活动的参加,这个时候是被允许的)
- 如何保证奖品不会被超发,这一部分在该系统中,采用了一个比较 “笨” 的方法,但是也是针对小型平台更容易实现的方法。即先给用户一个奖品标记,然后再根据用户奖品在数据库中的时序位置,进行最终中奖信息的判断,例如,用户中奖一个机械键盘,在数据库中是中机械键盘的第 6 位置,但是一共只有 5 个机械键盘,所以此时会对用户的中奖信息二次核对并标记未中奖。(当然,这种做法针对小规模活动是可以的,但是针对大型活动是不可取的,因为用户是否中奖这件事情,会导致多次数据库的读写操作,在一定程度上是不合理的)
- 用户中奖之后,提交了奖品邮寄信息,如何保证该信息的安全性,不被其他人暴力遍历出来也是值得关注的问题,此处采用增加了一个随机token,以增加被暴力遍历出来的复杂度,进一步保障安全;
03
部署准备工作
本次部署无需域名,使用函数计算生成的自定义域名即可,依然需要安装好 Serverless Devs 工具,本次只需开通函数计算即可。
操作步骤
摇奖后台的部分模板还在准备中,仅演示部署前端和数据层的服务。
步骤 1:秘钥配置
参考 Serverless Devs 阿里云秘钥配置(网址见文末)
步骤 2:初始化
使用 Serverless Devs 命令行工具执行
s init blindbox-game
进入引导式操作
步骤 3:构建部署
修改一下相关的配置信息,执行s deploy
,时长01:04
04
效果查看
函数部署情况:
页面效果:
摇奖部分的应用模板正在准备中,后续也会统一在这个应用模板给大家提供展示。
05
结语
上面实践结束后关于低代码和 Serverless 这个话题想跟大家再展开一下,以下部分并会以理论性为主,希望能够给读者带来不一样的收获。
开发者视角的 Serverless + 低代码
就我自身而言的话,明确的结论是我并不排斥两者的相容,反而非常期待这两者结合能够进一步让我的工作更加高效,安全。
本次活动我的最大感触是,如果低代码平台能够跟 Serverless 无缝衔接就好了,比如我在低代码上调用接口现在只能构建发到线上之后才能测试,这点天然集成好的平台优势就会很明显。另外就是发布构建好前端之后还得再去跟后端接口组装,这个如果是统一平台的话搞完需求就可以一键发布,会省不少事。不过这里也比较矛盾,因为我也担心一旦低代码的前端跟 Serverless 的后端耦合在一起就会变得不灵活,被服务商锁定。
供应商视角的 Serverless + 低代码
可以看到现在云服务商的 Serverless 和低代码的服务商在互相融合。比如低代码平台领导者 outsystem 早在 2016 年就开始使用 AWS 的服务,比如 Lambda 等为他们的客户提供原生 APP 服务的构建。
以 serverless & model-driven application 作为主体服务的低代码平台 Trillo 则是以 Google 云服务构为基础帮助他们的用户构建 Serverless 服务和前端应用,当然国内外的各家云厂商也没闲着 Azure 将自家的低代码产品 Power Apps 融入了 Serverless 的能力形成 Serverless Power Apps,将二者的优势做了充分融合。
Aws 将前端的集成都交给了伙伴,自身更专注于服务侧的 Serverless 集成,并且推出了 Step Functions Workflow Studio 产品将 Serverless 跟自家几乎所有的产品串联到了一起。
国内腾讯推出了微搭低代码平台,也是主打 Serverless + 低代码,在小程序场景发力,各厂商的跟进也说明了对这个领域的重视。
打造 Serverless + 低代码平台的设想
Serverless + 低代码平台的价值是比较明确的,效率,安全,成本都是它的关键词。那么假设我们要去建设这样的平台需要做哪些方面的考虑呢?
首先是从平台能力上,应该要做到能够覆盖一个应用开发从前到后的方方面面。比如:
- 数据建模
- 数据模型 API 化
- 使用 Serverless 构建后端应用逻辑
- 支持部署 Long-Runing 的后端服务
- 可扩展的外部服务集成
- 文件存储
- 逻辑编排
- 各种安全能力比如身份验证,权限控制等
- UI 编排
- CI/CD
- 应用可观测
这里可以简单理一下这个平台的功能设计,依托于云厂商的基础设施构建相应的能力。
相关的低代码能部分的能力有一些相关的开源产品,这里可以分享给大家:
- ui 页面搭建https://github.com/alibaba/designable
- 数据库建模https://gitee.com/robergroup/chiner
- 流程编排https://github.com/i5ting/imove
另外跟云基础设施打通部分可以考虑利用 Serverless Devs 的 Iac 能力,尤其是目前在跟 FC 的集成上成熟度比较高,可以很方便的对函数全生命周期进行管理。
当然以上仅是笔者的一些设想,我深知实现这样的系统绝非易事,这里也只是抛转引玉用。
追求生产效率的提升始终是企业生产的重要话题,Serverless 和低代码在各自的技术领域上有着独立的分工,却也有着共同的提高生产效率的特性,学会同时掌握利用好这两个生产力工具或许会是从事信息产业同学的重要竞争力。
文中涉及链接汇总(可滑动)
阿里云API网关:https://www.aliyun.com/search?k=api%E7%BD%91%E5%85%B3&page 函数计算CustomRuntime:https://help.aliyun.com/document_detail/132044.html Django:https://www.djangoproject.com/ ServerlessDevs阿里云密钥:http://www.serverless-devs.com/zh-cn/docs/provider-config/alibabacloud.html



