【问题标题】:Auto Logout from android application after 15min of inactivity (Session managment)闲置 15 分钟后从 android 应用程序自动注销(会话管理)
【发布时间】:2017-07-26 21:11:56
【问题描述】:

我有一个 Android 应用程序,它通过 REST API 网络服务与服务器通信。我需要在 android 应用程序中应用会话管理。在服务器端,如果有 15 分钟不活动,用户将被注销并生成新的身份验证令牌。我想在我的 android 应用程序中进行会话管理。我正在使用Volley 进行网络调用。

这样做的原因:

我想应用会话管理,因为在 15 分钟不活动后,服务器将生成一个新的令牌密钥并使会话无效。那么android应用就需要有服务器生成的新token key来进行认证和成功的web服务调用。

到目前为止我在 Android 中的会话管理:

我的MainActivity 代码:

public class MainActivity extends AppCompatActivity {

    public static final long DISCONNECT_TIMEOUT = 600000;// 15 min

    private Handler disconnectHandler = new Handler() {
        public void handleMessage(Message msg) {
        }
    };

    private Runnable disconnectCallback = new Runnable() {
        @Override
        public void run() {
            // Perform any required operation for log out
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    };

    public void resetDisconnectTimer() {
        disconnectHandler.removeCallbacks(disconnectCallback);
        disconnectHandler.postDelayed(disconnectCallback, DISCONNECT_TIMEOUT);
    }

    public void stopDisconnectTimer() {
        disconnectHandler.removeCallbacks(disconnectCallback);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onUserInteraction() {
        resetDisconnectTimer();
    }

    @Override
    public void onResume() {
        super.onResume();
        resetDisconnectTimer();
    }

    @Override
    public void onStop() {
        super.onStop();
        stopDisconnectTimer();
    }
}

如何检查会话是否在服务器端超时或如何在 15 分钟不活动后注销用户。

【问题讨论】:

    标签: android


    【解决方案1】:

    就像你说的,在你的服务器端,你应该有一个令牌和一个过期日期,你应该经常检查每个用户请求。令牌变得无效如果日期过期并且用户在开始新会话之前没有更多响应(这样,您可以重定向到登录页面,因为服务器响应是“无效令牌”或“会话时间已过”)。

    换句话说,简单地说,如果会话已经过期,没有人需要监视。只有当用户发出新请求时,服务器才会验证用户会话。它足够安全。

    【讨论】:

      【解决方案2】:

      正如之前的答案所说,您应该让服务器(REST API)来处理。

      在来自您的 android 应用程序的每个请求中,将您拥有的令牌作为标头发送(只是最佳实践),并让服务器始终先验证该令牌,然后再执行其他任何操作。如果令牌不再有效,您可以让他向您发送带有 HTTP 401 或其他 HTTP 代码的特殊响应,告诉您会话超时。

      在您的 Android 应用程序中,您必须处理此响应并自动启动/重定向到登录。一旦他登录,一切都照常。

      如果您愿意,您可以尝试记住用户在被抛出之前的位置,并在他再次获得授权后重定向回该活动。

      以下是 REST 会话管理的一些资源:
      https://www.quora.com/What-is-the-best-way-of-session-management-in-REST-architecture

      If REST applications are supposed to be stateless, how do you manage sessions?

      http://blog.synopse.info/post/2011/05/24/How-to-implement-RESTful-authentication

      https://www.owasp.org/index.php/REST_Security_Cheat_Sheet

      【讨论】:

        【解决方案3】:

        您不必在 android 应用程序中使用任何会话管理,更好地处理您必须在标头参数中发送令牌的每个请求,在服务器端,令牌身份验证得到处理并返回响应 JSON,在客户端 -你必须对响应 JSON 应用逻辑

        【讨论】:

          猜你喜欢
          • 2020-12-27
          • 1970-01-01
          • 2013-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-22
          相关资源
          最近更新 更多