0

我正在制作一个简单的数据收集服务的原型。我已经实现了一个使用 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
4

1 回答 1

1

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

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

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

于 2013-09-17T23:49:59.827 回答