我目前正在使用微框架Flask在python中编写一个rest API。 这是一个私有API,它处理用户数据。我计划使用此API来构建网络和Android应用。
现在我使用摘要身份验证来保护私人用户数据。例如,如果您想使用用户bob在我的服务上发布数据,您可以在myapi / story / create上发布请求,并使用摘要模式提供bob的凭据。
我知道这不是一个好的解决方案,因为:
-Digest auth不安全
- 客户端未经过身份验证(如何保护与当前用户无关的请求,例如创建新用户?)
我读了很多关于oAuth的内容,但是三脚认证似乎有点过分,因为我不打算向第三方开放我的API。
2脚oAuth不合适,因为它只为客户提供身份验证,而不是为用户提供身份验证
oAuth的另一个问题是我没有找到在Python中实现它的综合指南。我找到了python-oauth2库,但我不了解服务器示例,我找不到其他文档。此外,似乎oAuth的许多方面都未包含在此示例中。
所以我的问题是:
任何帮助或建议将不胜感激。
答案 0 :(得分:7)
简单的答案是仅通过HTTPS公开您的API,然后使用HTTP基本身份验证。我认为没有理由去理解Digest。基本身份验证是不安全的,但随每个请求一起提交,因此您永远不必担心您的身份验证过时或者其他问题。通过在HTTPS上进行隧道传输,您可以建立安全连接。
如果要对客户端进行身份验证,可以使用SSL客户端证书。也就是说,一般来说真的很难将客户端锁定在恶意用户身上,所以我会考虑让注册功能公开访问,并通过带外帐户验证来保护自己免受DOS等攻击。
答案 1 :(得分:3)
您是否已考虑过使用基本身份验证?
我还没有使用你提到的框架,但我使用基本身份验证来保护基于web.py的应用程序中的某些网址并且工作正常。
基本上,你可以在base64中使用一个令牌,它实际上是一个标准的http heeader。
也许这个例子可以帮到你:
class Login:
def GET(self):
auth = web.ctx.env.get('HTTP_AUTHORIZATION')
authreq = False
if auth is None:
authreq = True
else:
auth = re.sub('^Basic ','',auth)
username,password = base64.decodestring(auth).split(':')
if (username,password) in settings.allowed:
raise web.seeother('/eai')
else:
authreq = True
if authreq:
web.header('WWW-Authenticate','Basic realm="Auth example"')
web.ctx.status = '401 Unauthorized'
return
答案 2 :(得分:0)
如果您对基本身份验证感兴趣,可以使用以下快速属性来装饰处理程序http://www.varunpant.com/posts/basic-authentication-in-web-py-via-attribute。这个例子主要是在web.py上下文中编写的,但我想它可以很容易地调整。
def check_auth(username, password):
return username == 'username' and password == 'password'
def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
auth = web.ctx.env['HTTP_AUTHORIZATION'] if 'HTTP_AUTHORIZATION' in web.ctx.env else None
if auth:
auth = re.sub('^Basic ', '', auth)
username, password = base64.decodestring(auth).split(':')
if not auth or not check_auth(username, password):
web.header('WWW-Authenticate', 'Basic realm="admin"')
web.ctx.status = '401 Unauthorized'
return
return f(*args, **kwargs)
return decorated