Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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中管理Oauth访问令牌及其在活动之间的流?_Android_Oauth_Access Token_Retrofit - Fatal编程技术网

如何在android中管理Oauth访问令牌及其在活动之间的流?

如何在android中管理Oauth访问令牌及其在活动之间的流?,android,oauth,access-token,retrofit,Android,Oauth,Access Token,Retrofit,我使用rails和doorkeeper构建了一个RESTAPI。我使用断言授权流和facebook登录在android客户端创建和登录用户 我已成功登录并使用改装从服务器获得访问令牌。访问令牌具有令牌、刷新令牌、令牌类型、到期时间和创建时间信息 当用户浏览我的android应用程序时,我有以下选项来管理和维护此令牌 当用户打开应用并登录时,将access token中的所有信息保存在SharedReferences中。现在,它导致了成功登录时的主要活动,我使用令牌访问共享首选项和访问api 第二

我使用rails和doorkeeper构建了一个RESTAPI。我使用断言授权流和facebook登录在android客户端创建和登录用户

我已成功登录并使用改装从服务器获得访问令牌。访问令牌具有令牌、刷新令牌、令牌类型、到期时间和创建时间信息

当用户浏览我的android应用程序时,我有以下选项来管理和维护此令牌

  • 当用户打开应用并登录时,将access token中的所有信息保存在SharedReferences中。现在,它导致了成功登录时的主要活动,我使用令牌访问共享首选项和访问api
  • 第二个选项是,我将访问令牌对象作为parcelable对象传递,并在下一个活动中使用此对象获取访问令牌
  • 我可以通过将访问令牌与当前时间和创建的时间进行比较来检查访问令牌是否过期。每次访问api之前。如果它确实过期,我将使用refresh\u token访问一个新令牌

    我认为以上两种方法都会导致代码重复和重复相同的事情

  • 如果有其他方法可以做到这一点,那也太好了。我认为如果我的改造客户端能够管理令牌是否过期,并且如果它确实过期,它应该请求一个新的令牌,那就太好了。简言之,我正在考虑使用某种拦截器。但我不知道怎么做
  • 以上哪种方法更合适


    谢谢

    我认为最可靠的方法是扩展您的
    应用程序
    类,并在那里管理您可能希望使用令牌执行的每个进程

    这样,您就有了一个共同的地方,您的所有活动都可以与之交互——避免代码重复。此外,它是第一个被调用的类,因此您可以确保下次调用应用程序时,您的第一个活动将已经能够使用令牌

    对于数据持久性,我强烈建议将所有信息存储在
    SharedReferences
    中。毕竟,他们被认为正是为了这个目的

    AndroidManifest.xml

    [...]
    <application
            android:name="com.yourpackage.YourApp"
    
    [...]
    
    然后访问使用的方法

    YourApp.getInstance().getAccessToken();
    

    您应该在登录后将数据存储在单例中,以便您可以在应用程序中的任何位置访问数据


    然后,如果您将OkHttp与改型一起使用,您可以使用OkHttp的拦截器(如本文所述)在令牌过期时刷新令牌。

    我需要将accessToken设置为静态吗?因为如果我让它是非静态的,它就不起作用了。如果我将其保留为非静态变量,则在下一个活动中会给出null值。@StarWars是的,您应该使用单例模式。我已经更新了密码。我想这个问题可能会回答这个问题。可能重复的
    YourApp.getInstance().getAccessToken();