从手机登录到Django,如何设置ApiKeyAuthentication

从手机登录到Django,如何设置ApiKeyAuthentication,django,login,django-models,tastypie,api-key,Django,Login,Django Models,Tastypie,Api Key,我已经在Django项目中设置了Tastypie,并且API正确地服务于资源。我现在正试图允许移动用户(应用程序)通过上述API注册、登录和注销 类基本资源(ModelResource): 类元: 允许的_方法=['get'] 身份验证=基本身份验证() 类用户资源(BaseResource): 类元: queryset=User.objects.all() 资源名称='用户' ... 类配置文件资源(BaseResource): 类元: queryset=Profile.objects.al

我已经在Django项目中设置了Tastypie,并且API正确地服务于资源。我现在正试图允许移动用户(应用程序)通过上述API注册、登录和注销

类基本资源(ModelResource):
类元:
允许的_方法=['get']
身份验证=基本身份验证()
类用户资源(BaseResource):
类元:
queryset=User.objects.all()
资源名称='用户'
...
类配置文件资源(BaseResource):
类元:
queryset=Profile.objects.all()
资源名称='profiles'
...
所以这是我的第一个目的。关于登录,我不认为
BasicAuthentication
适用于手机请求。据我所知,似乎有几种方法可以满足我的需求:

在第一个链接(请参阅)中,困扰我的是移动应用程序必须发送包含原始密码的JSON:

{'username':'me','password':'l33t'}
难道有人/事不可能获取这个JSON,从而访问密码吗?使用
ApiKeyAuthentication
不是更好吗

我读的越多,了解的就越少。如果帐户是从Web平台(
django userena
)创建的,那么我不能使用
ApiKeyAuthentication
,因为应该创建密钥


我可以找到几种方法来做我想做的事,但我找不到合适的方法。。。我确实意识到这个问题已经被问了很多次,也被回答了很多次,但我正在寻找如何根据我的需求以最佳方式实施这个问题的方向。

我最终做了以下几点:

#──────────────────────────────────────────────────────────────────────────────
类BaseResource(ModelResource):
# ──────────────────────────────────────
def prepend_URL(自身):
尝试:
附加\u URL=self.\u meta.附加\u URL
除属性错误外:
其他URL=[]
返回[url(r'^'+u[0]+'$',self.wrap_视图(u[1]),name=u[2]),用于附加_url中的u]
# ──────────────────────────────────────
def就地更新(自身、请求、原始捆绑包、新数据):
尝试:
允许的\u字段=自身。\u元。允许的\u字段
除属性错误外:
允许的\u字段=无
如果允许\u字段和set(new\u data.keys())-set(允许的\u字段):
raise BADDREQUEST('仅可更改字段:{}'。格式(','.join(允许的_字段)))
返回super(ProfileResource,self)。就地更新(请求、原始包、新数据)
# ──────────────────────────────────────
类元:
抽象=真
允许的_方法=['get',]
authentication=ApiKeyAuthentication()
authorization=DjangoAuthorization()
最大限制=1000
#──────────────────────────────────────────────────────────────────────────────
类UserResource(BaseResource):
...
# ──────────────────────────────────────
def注册(自我、请求、**kwargs):
...
# ──────────────────────────────────────
def签名(自我、请求、**kwargs):
self.method_check(请求,允许=['post']))
data=self.deserialize(
要求
请求机构,
format=request.META.get('CONTENT\u TYPE','application/json')
)
username=data.get('username','')
password=data.get('password','')
用户=验证(用户名=用户名,密码=密码)
如果用户:
如果user.u处于活动状态:
#登录(请求、用户)
尝试:
key=ApiKey.objects.get(user=user)
如果不是key.key:
key.save()
除ApiKey.DoesNotExist外:
key=ApiKey.objects.create(user=user)
返回self.create_响应(请求{
"成功":对,,
“数据”:key.key,
})
其他:
返回self.create_响应(请求{
“成功”:错误,
“消息”:“用户未处于活动状态”,
},http(禁止)
其他:
返回self.create_响应(请求{
“成功”:错误,
'消息':'密码错误',
},http(未经授权)
# ──────────────────────────────────────
类元(BaseResource.Meta):
允许的_方法=['get','patch',]
queryset=User.objects.all()
资源名称='用户'
排除=['名字','姓氏','密码']
过滤={
...
}
其他URL=[
('signup/'、'signup'、'api signup'),
('signin/'、'signin'、'api signin'),
]
允许的_字段=['email',]