我正在制作一个简单的数据收集服务的原型。我已经实现了一个使用 python 3x stock HTTPServer 实现的简单 REST API。以及一个通过 json/POST 提交数据的简单 iPhone 应用程序。当我的 iPhone 与服务器在同一个网络上时,这一切都很好。
但现在我想进行下一步。我还不需要超越原型/PoC,我只想能够在我们的内部网络之外完成它。获取访问权限、名称解析、端口等问题......我应该添加什么样的安全性?我对那部分很陌生(我猜还有其他东西)。
我找到了这个如何将 SSL 添加到我的 python 服务的示例。如果我能弄清楚如何将正确的键嵌入到我的 iPhone 应用程序中(它只是在我的手机上,而不是其他任何人的),那就足够了。或者我应该包括某种身份验证?如果有,是什么样的?任何有关如何开始的指示都将不胜感激。
更新
根据建议切换到 Tornado 后,我想出的代码供其他人参考,如下所示:
import tornado, tornado.web, tornado.httpserver
#Create a "Application" that links the restful URL with a custom class named RestHandler
RestServices = tornado.web.Application([(r'/twig_monikers', RestHandler)])
#Startup tornado
def main():
server = tornado.httpserver.HTTPServer(RestServices,
ssl_options={'certfile': 'cert', 'keyfile': 'key'}) #This is where you put the paths to your generated cert and key files.
server.listen(44321) #start on port 44321
tornado.ioloop.IOLoop.instance().start()
main
当然适当地调用。唯一的另一部分是创建一个RestHandler
类来处理任何以/twig_monikers
class RestHandler(tornado.web.RequestHandler):
def authenticate(self): #implements basic auth checking of the Authorization header
header = self.request.headers.get('Authorization', '')
passed = False
if header.startswith('Basic '):
userPass = base64.b64decode(header[6:].encode('ascii')).decode('ascii')
user , password = userPass.split(':')
passed = user == 'acceptable_username' and password == 'acceptable_password'
if not passed:
raise tornado.web.HTTPError(403)
def put(self): #causes our RestHandler to respond to HTTP 'PUT' verbs
self.authenticate() #first validate the packet
keyedValues = json.loads(self.request.body.decode('utf8'))
self.doSomethingWithJsonPayload(keyedValues)
def doSomethingWithJsonPayload(self, keyedValues):
pass #do your own thing here