2016-11-20 1 views
0

Firebaseトークンを取得する呼び出しを行い、そのトークンを使用してサーバーからトークンを取得しています。オーバーライドされたコールバックから値を返します

userSignIn()私のサーバーからトークンを返すようにします。
トークンをuserSignIn()に返す方法を知っている人はいますか?

@Override 
public String userSignIn(String email, String password, String authType) throws Exception { 
    login(email, password, authType, new OnLoginResponseCallback() { 
     @Override 
     public String onLoginResponse(boolean success, String token) { 
      **return token;** // how do I return this to userSignIn??? 
     } 
    }); 
} 

public interface OnLoginResponseCallback { 
    public String onLoginResponse(boolean success, String token); 
} 

public void login(String email, String password, String authType, final OnLoginResponseCallback callback) throws Exception { 
    getFirebaseToken(email, password, new OnFirebaseTokenResponseCallback() { 
     @Override 
     public String onFirebaseTokenResponse(boolean success, String token) { 
      getAuthToken(token, null, new OnAuthTokenResponseCallback(){ 
       @Override 
       public String onAuthTokenResponse(boolean success, JSONObject response){ 
        try { 
         String access_token = response.getString("access_token"); 
         callback.onLoginResponse(true, access_token); 
        } 
        catch (JSONException ex) { 

        } 
       } 
      }); 
     } 
    }); 
} 

public interface OnFirebaseTokenResponseCallback { 
    public String onFirebaseTokenResponse(boolean success, String token); 
} 

public void getFirebaseToken(String email, String password, final OnFirebaseTokenResponseCallback callback) { 
    FirebaseAuth auth = FirebaseAuth.getInstance(); 
    auth.signInWithEmailAndPassword(email, password) 
      .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        if (!task.isSuccessful()) { 

        } else { 
         AuthResult result = task.getResult(); 
         FirebaseUser user = result.getUser(); 
         user.getToken(false).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() { 
          @Override 
          public void onComplete(@NonNull Task<GetTokenResult> task) { 
           if (task.isSuccessful()) { 
            try { 
             String token = task.getResult().getToken(); 
             callback.onFirebaseTokenResponse(true, token); 
            } 
            catch (Exception ex) { 

            } 
           } else { 

           } 
          } 
         }); 
        } 
       } 
      }); 
} 


public interface OnAuthTokenResponseCallback { 
    public String onAuthTokenResponse(boolean success, JSONObject response); 
} 

public void getAuthToken(String token, String refreshToken, final OnAuthTokenResponseCallback callback) throws JSONException { 
    RequestParams params = new RequestParams(); 
    if (refreshToken != null) 
    { 
     params.add("grant_type", "refresh_token"); 
     params.add("refresh_token", refreshToken); 
    } 
    else if (token != null) 
    { 
     params.add("grant_type", "urn:ietf:params:oauth:grant-type:firebase_token"); 
     params.add("assertion", token); 
    } 
    else if (refreshToken == null && token == null) 
    { 
     params.add("grant_type", "password"); 
     params.add("username", ""); 
     params.add("password", ""); 
    } 
    AuthClient.post("connect/token", params, new JsonHttpResponseHandler() { 
     @Override 
     public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, JSONObject response) { 
      try { 
       callback.onAuthTokenResponse(true, response); 
      } catch (Exception ex) { 

      } 
     } 
     @Override 
     public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, Throwable throwable, JSONObject response) { 
      callback.onAuthTokenResponse(false, new JSONObject()); 
     } 
    }); 
} 

UPDATE:

感謝。私は冗長な方法を取り除いて、次のようにログインしてください:

.login(userName, userPass, mAuthTokenType, new OnLoginResponseCallback() { 
    @Override 
    public void onLoginResponse(boolean success, String token) { 
    data.putString(AccountManager.KEY_ACCOUNT_NAME, userName); 
    data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType); 
    data.putString(AccountManager.KEY_AUTHTOKEN, token); 
    data.putString(PARAM_USER_PASS, userPass); 
    } 
}); 

私はそれが動作すると思いますが、それを完全にテストする機会はありませんでした。私が確信していないことは、「データ」を「トークン」からの値で修正しようとしていることです。しかし、「データ」は最終的なバンドルなので、動作するかどうかはわかりません。後でテストします。ありがとう。

+2

"誰でも私は 'userSignIn' にトークンを返すことができる方法を知っているの?" 読むことができます、がん- あなたはそうしない。 'onLoginResponse()'メソッドから 'token'が必要なコードを起動します。 –

+1

インタフェースメソッドはデータを返す必要はありません。彼らはすべて無効にすべきです –

答えて

1

あなたは基本的に同じ署名の別の方法あなたがuserSignInを呼ぶだろうどこ

@Override 
public String userSignIn(String email, String password, String authType) throws Exception { 
    login(email, password, authType, new OnLoginResponseCallback() { 
     @Override 

代わりに、あなたはloginを呼び出し、その匿名クラスを渡すを呼び出すメソッドを呼び出しました。コールバックの仕組みではないので、これらの内部メソッドから戻ることはできません。インターフェイスメソッドのパラメータを使用してロジックを「続行」します。同様に、login、main関数へのコールバックをいくつかのユーザー情報で行い、この情報を使って新しいリクエストを作成し、そのデータを待っているコールバックを持って、別のメソッドにデータを戻します。他のメソッドを呼び出すのはすべてvoidのメソッドです。 return文ません

JavaScriptで、あなたはこの

How to return value from an asynchronous callback function?

0

なぜあなたは既にそのメソッドの下にあるので、実際にはっきりしていないトークンを返すのですか? onLoginResponse()内で作業をやり直すことも、別の方法を呼び出すこともできます。

関連する問題