Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何安全地设置您的网站允许Android应用程序永久登录_Android_Django_Session Timeout_Api Key - Fatal编程技术网

如何安全地设置您的网站允许Android应用程序永久登录

如何安全地设置您的网站允许Android应用程序永久登录,android,django,session-timeout,api-key,Android,Django,Session Timeout,Api Key,我所在的团队有一个用Django创建的网站。我们开始制作Android应用程序。我们在一些与如何正确处理身份验证相关的问题上有些困惑。我将在这里介绍其中一个: 我们的假设是,在正常情况下,用户无需多次登录移动应用程序。例如,在我的Android设备上,我已经有一年没有登录谷歌应用了,或者有几个月没有登录Trello应用了 如果我们使用Django通常的会话系统,并且用户停止使用应用程序的时间足够长,那么用户将注销。我们可以有一个API密钥,应用程序使用该密钥对网站进行身份验证,该密钥可以用来登录

我所在的团队有一个用Django创建的网站。我们开始制作Android应用程序。我们在一些与如何正确处理身份验证相关的问题上有些困惑。我将在这里介绍其中一个:

我们的假设是,在正常情况下,用户无需多次登录移动应用程序。例如,在我的Android设备上,我已经有一年没有登录谷歌应用了,或者有几个月没有登录Trello应用了

如果我们使用Django通常的会话系统,并且用户停止使用应用程序的时间足够长,那么用户将注销。我们可以有一个API密钥,应用程序使用该密钥对网站进行身份验证,该密钥可以用来登录而不是密码,然后建立一个新的会话密钥。然而,听起来您也希望定期更新API密钥,这似乎再次出现了同样的问题

由于这是一个安全问题,我们不想依赖直觉或看似合理的解决方案。我们知道这是一个深奥的领域。我们想确保我们知道正确的方法是什么

因此,以下是我们考虑过的一些可能的方法,以及可能的缺点:

每天在后台发出一次会话续订请求。 这需要一个后台服务,这可能会让用户感到困惑,或者使用比他们希望的更多的电源,从而让用户感到不快。我们的许多用户可能在世界上互联网连通性较低的地区,不希望后台进程无缘无故地发出请求

使用API密钥,使其过期,但在任意时间后仍允许续订。 如果用户在5个月后回来,允许他们使用旧的API密钥一次,只生成一个新的API密钥。这类似于密码过期策略。但是,如果API密钥的操作假设与会话密钥相同,则这似乎不符合正确的策略

使用谷歌的云消息系统定期向他们发送新密钥 让谷歌来处理棘手的事情。无可否认,这有点脱离了左派

实现Oauth2提供程序 看起来有点过分了,但也许吧?看来刷新令牌/访问令牌系统正是我想要的

我将把一个因素作为一个脚注,因为我不想用一个独立的问题分散我的注意力,但这可能比我假设的更加相互依赖:对于我们应用程序的V1,我们将非常依赖Web视图,但仍然有一些直接的API调用。我们面临的问题是如何协调API调用和Web视图之间的身份验证。最初我们认为我们必须协调API调用的API密钥和web视图的会话之间的身份验证,但是从阅读其他Stackoverflow响应来看,听起来我可以在这两者之间共享会话cookie,尽管我还没有确认这一点


非常感谢。

我认为您可以使用中描述的方法:

实现您的视图并检索您的用户详细信息 手动指定身份验证后端。 使用loginrequest登录您的用户,用户 代码如下所示:

from django.contrib.auth import login

def your_view(request):

    // retrieve your user
    ...

    // you can write your own backend to do lots of things
    user.backend='django.contrib.auth.backends.ModelBackend'

    login(request, user)

谢谢,那对我很有用。然而,它并没有回答我这里的基本问题,即如何在移动设备上建立一个安全范例,在正常情况下,不需要用户多次输入密码。要清楚,这个问题更多的是关于会话cookies和令牌,而不是关于Django和Andoid。