原型iPhone应用程序和Python SimpleHTTPServer之间的简单安全性

原型iPhone应用程序和Python SimpleHTTPServer之间的简单安全性,python,ios,http,rest,authentication,Python,Ios,Http,Rest,Authentication,我正在设计一个简单的数据收集服务原型。我已经实现了一个使用Python3x stock HTTPServer实现的简单RESTAPI。还有一个简单的iPhone应用程序,通过json/POST提交数据。当我的iPhone和服务器在同一个网络上时,一切都很好 但现在我想走下一步。我不需要超越prototype/PoC,我只想在我们的内部网络之外完成它。获取访问、名称解析、端口之类的问题。。。我应该给它添加什么样的安全性?我对那个部分(我想还有其他的东西)还不熟悉 我找到了如何将SSL添加到pyth

我正在设计一个简单的数据收集服务原型。我已经实现了一个使用Python3x stock HTTPServer实现的简单RESTAPI。还有一个简单的iPhone应用程序,通过json/POST提交数据。当我的iPhone和服务器在同一个网络上时,一切都很好

但现在我想走下一步。我不需要超越prototype/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\u名字对象结尾的任何URL

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

http.server
是相当低级的。我将使用一个轻量级的web框架来编写REST服务,因为许多人已经有了用于身份验证的插件和用于REST服务的包装器

我主要使用和。两者都有用于身份验证和RESTful API的插件/内置类:


这两种身份验证包装器都不对您的设置进行任何假设。对于实际的REST服务,使用HTTPS并实现某种API令牌来识别用户。这两个框架都支持HTTPS,因此实现起来非常简单。

http.server
一次只能处理一个请求。使用Tornado或其他一些非阻塞的web框架来实现RESTAPI。在原型设计的这一点上,我远没有认为(阻塞)是一个问题。我的iPhone是唯一一个有代码可以点击服务的人。但我并不反对最终使用更高级别/更健壮的框架。事实上,我完全希望一切顺利。你觉得现在的开销比我想的要多吗?更重要的是,这会使在这一点上添加适当的安全性变得更容易吗?我最终改用了Tornado,生活变得更容易/更好。我将在下面我自己的答案中发布一些示例代码。