我正在为一个简单的数据收集服务进行原型设计。我已经实现了一个用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