【问题标题】:How to manage Oauth access token in android and its flow between activities?如何在 android 中管理 Oauth 访问令牌及其在活动之间的流动?
【发布时间】:2015-10-12 10:23:54
【问题描述】:

我已经使用 rails 和 doorkeeper 构建了一个 Rest API。我正在使用断言授权流程和 facebook 登录在 android 客户端中创建和登录用户。

我已经成功登录并使用改造从我的服务器获得了访问令牌。访问令牌有 tokenrefresh_tokentoken_typeexpires_increated_at 信息。

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

  1. 当用户打开应用程序并登录时,将访问令牌中的所有信息保存在 SharedPreferences 中。现在成功登录后会导致主要活动,我使用令牌访问共享首选项并访问 api。
  2. 第二个选项是,我将访问令牌对象作为可打包对象传递,并在下一个活动中使用此对象获取 access_token。

我可以通过将 access_token 与当前时间和 created_at 时间进行比较来检查它是否已过期。每次访问 api 之前。如果它确实过期了,我会使用 refresh_token 访问一个新的令牌。

我认为上述两种方法都会导致代码重复并重复同一件事。

  1. 如果有任何其他方法可以做到这一点,那也很好。我认为如果我的改造客户端可以管理令牌是否过期并且如果它确实过期,它应该请求一个新的令牌。简而言之,我正在考虑使用某种拦截器。但我不知道该怎么做。

以上哪种方式更适合。

谢谢!

【问题讨论】:

标签: android oauth access-token retrofit


【解决方案1】:

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

如果你使用 OkHttp 进行改造,你可以使用 OkHttp 的拦截器,如this 帖子中所述,在过期时刷新令牌。

【讨论】:

    【解决方案2】:

    我认为最可靠的方法是扩展您的 Application 类,并在那里管理您可能想要使用令牌执行的每个过程。

    通过这种方式,您拥有一个可以与您的所有活动交互的公共场所 - 避免了代码重复。此外,它是第一个被调用的类,因此您可以确保下次调用您的应用时,您的第一个 Activity 将能够使用该令牌。

    对于数据持久性,我强烈建议将所有信息存储在SharedPreferences 中。毕竟,他们正是为此目的而考虑的。

    AndroidManifest.xml

    [...]
    <application
            android:name="com.yourpackage.YourApp"
    
    [...]
    

    YourApp.java

    public class YourApp extends Application {
    
        private static YourApp sInstance;
    
        String accessToken;
    
        @Override
        public void onCreate(){
            super.onCreate();
    
            sInstance = this;
    
            accessToken = retrieveTokenFromSharedPrefs();
    
        }
    
        public static YourApp getInstance() {
            return sInstance;
        }
    
        private String retrieveTokenFromSharedPrefs() {
            // get your access token from SharedPrefs
        }
    
        private void setToken(String token) {
            accessToken = token;
            // save your access token in the SharedPrefs
        }
    
        public String getAccessToken() {
            return accessToken;
        }
    
        public boolean hasLoggedIn() {
            return getAccessToken() != null;
        }
    
        public boolean hasTokenExpired() {
            // ecc..
        }
    
    }
    

    然后访问使用的方法

    YourApp.getInstance().getAccessToken();
    

    【讨论】:

    • 我需要将 accessToken 设为静态吗?因为如果我让它非静态的话,它有点不起作用。如果我保持它为非静态变量,它会在下一个活动中给出空值。
    • @StarWars 是的,您应该使用单例模式。我已经更新了代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多