【问题标题】:OAuth Auto Refresh Token if token is expired如果令牌过期,OAuth 自动刷新令牌
【发布时间】:2016-09-10 02:20:51
【问题描述】:

我将为我的应用制作一个带有 OAuth2.0 的登录系统,在到达 Expired Token 之前一切正常!

对于本节,我编写了这个方法:

public static String getAccessToken(){

    String accessToken;

    if(!UserSession.getInstance().isExpired()){
        return UserSession.getInstance().getUserAuthAccessToken();
    } else {

        PostRequests.getFreshToken(new ResultListener<String>() {
            @Override
            public void getResult(String result, boolean error) {

                if(error){

                } else {

                    Authorization authorization = gson.fromJson(result, Authorization.class);
                    UserSession.getInstance().setUserAuthorizationInfo(authorization.AccessToken, authorization.TokenType, authorization.Expiration, authorization.RefreshToken, authorization.Scope);
                    accessToken = authorization.AccessToken;
                }

            }
        });

    }

}

如您所见,如果未过期,我会在我的应用共享偏好中返回访问令牌存储,但如果已过期,我会发出刷新请求 (Volley + Gson),以使其保持新鲜。

但我无法从内部类联系accessToken :(

如何从这个方法返回字符串?

【问题讨论】:

    标签: android oauth-2.0 inner-classes final local-variables


    【解决方案1】:

    使用侦听器是解决此问题的一种方法。

    public interface ITokenListener {
        void onTokenObtained(String accessToken);
    }
    
    public void usingGetAccessTokenMethod() {
        getAccessToken(new ITokenListener() {
            @Override
            public void onTokenObtained(String accessToken) {
                //use accessToken
            }
        });
    }
    
    public void getAccessToken(final ITokenListener listener){
    
        if(!UserSession.getInstance().isExpired()){
            listener.onTokenObtained(UserSession.getInstance().getUserAuthAccessToken());
        } else {
    
            PostRequests.getFreshToken(new ResultListener<String>() {
                @Override
                public void getResult(String result, boolean error) {
    
                    if(error){
    
                    } else {
    
                        Authorization authorization = gson.fromJson(result, Authorization.class);
                        UserSession.getInstance().setUserAuthorizationInfo(authorization.AccessToken, authorization.TokenType, authorization.Expiration, authorization.RefreshToken, authorization.Scope);
                        listener.onTokenObtained(UserSession.getInstance().getUserAuthAccessToken());
                    }
    
                }
            });
    
        }
    
    }
    

    【讨论】:

    • 它没有帮助,因为我将使用 .getAccessToken() 将令牌附加到我的请求 URL 的末尾,例如 final String URL = Constant.BaseUrl + Constant.Token + getAccessToken()
    • 你可以做这样的事情 public void usingGetAccessTokenMethod() { getAccessToken(new ITokenListener() { @Override public void onTokenObtained(String accessToken) { final String URL = Constant.BaseUrl + Constant.Token + accessToken + Constant.Limit; //在这里使用url } }); } 但正如我所说,这是其中一种方式。
    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 2022-11-11
    • 1970-01-01
    • 2017-11-20
    • 2020-05-05
    • 2014-01-01
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多