我正在拨打电话获取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());
}
});
}
更新
感谢。我删除了冗余方法,并按如下方式调用login:
.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);
}
});
我认为它有效,但还没有机会对它进行全面测试。我不确定的一件事是我试图用“令牌”中的值修改“数据”,但“数据”是最终的捆绑包,所以我不确定这是否有效。稍后会测试。感谢。
答案 0 :(得分:1)
为什么你要从那里返回令牌,因为你已经在这个方法之下了!您可以在onLoginResponse()
内完成其余工作,也可以调用其他方法。
答案 1 :(得分:1)
您调用的方法基本上调用了同一签名的另一种方法
@Override
public String userSignIn(String email, String password, String authType) throws Exception {
login(email, password, authType, new OnLoginResponseCallback() {
@Override
相反,只要您调用userSignIn
,就会调用login
,然后传入该匿名类。你无法从这些内部方法中返回,因为这不是回调的工作方式。您可以使用接口方法的参数来&#34;继续&#34;你的逻辑。比如,登录,使用一些用户信息回调主函数,使用此信息发出新请求,等待该数据的回调,将数据传递回其他方法。它是调用其他方法的所有void
方法。没有return
陈述
虽然在Javascript中,你可以阅读这个