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

时间:2013-09-17 23:23:13

标签: python ios http rest authentication

我正在为一个简单的数据收集服务进行原型设计。我已经实现了一个用python 3x stock HTTPServer实现的简单REST API。一个简单的iPhone应用程序,通过json / POST提交数据。当我的iPhone与服务器位于同一网络时,这一切都很有效。

但现在我想进入下一步。我还不需要超越原型/ PoC,我只想在内部网络之外做到这一点。获取访问权限,名称解析,端口和那种东西的问题......我应该添加什么样的安全性?我是那个部分的新手(我想其他的东西)。

我找到了this example如何将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

1 个答案:

答案 0 :(得分:1)

http.server相当低级。我会使用轻量级的Web框架来编写您的REST服务,因为许多人已经拥有用于REST服务的身份验证和包装的插件。

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

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