Android Firebase:Microsoft 身份验证失败

时间:2021-07-20 20:06:28

标签: java android firebase firebase-authentication

我从哪里得到我的客户端 ID Where I got my Client ID 我从哪里得到我的客户端密钥 Where I got my Client Secret Firebase Console - Microsoft 我一直试图在我的应用程序中使用 Firebase 身份验证,微软作为提供者使用 { {3}}。但是我在 Logcat 中遇到了一个错误说:

The supplied auth credential is malformed or has expired. [ Error getting 
verification code from microsoft.com response: 
error=invalid_request&error_description=AADSTS9002331:%20Application%20'8749ccd1-9dea- 
4920-a0fd- 72fffdcf2b38'(AppName)%20is%20configured%20for%20use%20by%20Microsoft%20Account%20users%20only.%20Please%20use%20the%20/consumers%20endpoint%20to%20serve%20this%20request.%0D%0ATrace%20ID:%20ba459e48-3fd1-4bd4-aa88-d878701b2d02%0D%0ACorrelation%20ID:%208157e86e-8acf-459f-9f18-07734bc971bb%0D%0ATimestamp:%202021-07-20%2019:56:47Z&state=AMbdmDmMtw9NcT5fPjPkiW7M0l70V9s86Tfhc5CVrSZYKpR1Dqw3PL8LrBYVT4zU26o-J2_ydtdFjRkwI074fWaWRO6J1KDc3b2xyT9wDilWZc13d52RgdIb6dGQRXllvdlzr1yDG3pMKzDofxRGxgCXVV_psklIoKsJ159ltFoacD-ezVsqKFnEJ89jdGCwoH3ijJ4eG1DovqbfbhfQu4kZ7IFqOnvHRHVrIC4ctO05K1HJ0mUjo1yUpT6ai383xajYdK3l767FkyU4JOG5M9yD0KBULxIwoZpvXqAG8bkgEf4ht3ugiCnceooKTA7IcipK3mwuyFrQ0OkHGZVOzP3czo-NzuKMZp6uQm5ewjczf8X3hBYUGfrk70qr2b7w_gFg5xkkPEE6drQJAyMOfY-H-rM1EJqtsWehRIvhHcFjwy2c0SGBxsH1U-HLUktCfx8&providerId=microsoft.com ] 

这是我的 MicrosoftAccountActivity:

package com.avs.auth;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.OAuthProvider;

import java.util.ArrayList;

public class MicrosoftAccountActivity extends AppCompatActivity {

    private FirebaseAuth firebaseAuth;
    private Button microsoftLoginButton;
    private ArrayList<String> arrayList;
    private OAuthProvider.Builder builder;
    private OAuthProvider provider;
    private Task<AuthResult> pendingResultTask;
    private UpdateUI updateUI;
    private Intent intent;
    private FirebaseUser firebaseUser;

    public static final String TAG = "MicrosoftAuth";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_microsoft_account);

        firebaseAuth = FirebaseAuth.getInstance();
        microsoftLoginButton = findViewById(R.id.microsoftLoginButton);

        microsoftLoginButton.setOnClickListener(onClickListener);
    }

    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            builder = OAuthProvider.newBuilder("microsoft.com");
            builder.addCustomParameter("prompt", "consent");
            builder.addCustomParameter("login_hint", "");
            builder.addCustomParameter("tenant", getString(R.string.microsoft_tenant_id));

            arrayList = new ArrayList<String>();
            arrayList.add("user.read");
            arrayList.add("email.read");

            builder.setScopes(arrayList);

            provider = builder.build();

            microsoftSignIn();
        }
    };

    private void microsoftSignIn() {
        pendingResultTask = firebaseAuth.getPendingAuthResult();
        if (pendingResultTask != null) {
            pendingResultTask.addOnSuccessListener(taskOnSuccessListener).addOnFailureListener(taskOnFailureListener);
        } else {
            firebaseAuth.startActivityForSignInWithProvider(this, provider)
                    .addOnSuccessListener(providerOnSuccessListener).addOnFailureListener(providerOnFailureListener);
        }
    }

    private OnSuccessListener<AuthResult> taskOnSuccessListener = new OnSuccessListener<AuthResult>() {
        @Override
        public void onSuccess(AuthResult authResult) {
            Toast.makeText(getApplicationContext(), "Account Creation Success", Toast.LENGTH_SHORT).show();
        }
    };

    private OnFailureListener taskOnFailureListener = new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            e.printStackTrace();
            Log.d(TAG, e.getMessage());
            Toast.makeText(getApplicationContext(), "Account Creation Failure", Toast.LENGTH_SHORT).show();
        }
    };

    private OnSuccessListener<AuthResult> providerOnSuccessListener = new OnSuccessListener<AuthResult>() {
        @Override
        public void onSuccess(AuthResult authResult) {
            Toast.makeText(getApplicationContext(), "Account Created", Toast.LENGTH_SHORT).show();
            firebaseUser = firebaseAuth.getCurrentUser();
            updateUI = UpdateUI.updateUI(firebaseUser, TAG, firebaseUser.getDisplayName());
            intent = new Intent(getApplicationContext(), MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }
    };

    private OnFailureListener providerOnFailureListener = new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            e.printStackTrace();
            Log.d(TAG, e.getMessage());
            updateUI = UpdateUI.updateUI(null, TAG, null);
            Toast.makeText(getApplicationContext(), "Account Creation Failure", Toast.LENGTH_SHORT).show();
        }
    };

如果您问我为什么所有内容都是私密的,那是因为它是我的其他身份验证提供商错误之一 (Google) 的解决方案。

无论如何,这是我的 UpdateUI 类:

package com.avs.auth;

import android.content.SharedPreferences;
import android.util.Log;

import com.google.firebase.auth.FirebaseUser;

public class UpdateUI {

    public static void updateUI(FirebaseUser user, String TAG, String userName){
        if (user != null){
            SharedPreferences.Editor editor = getSharedPreferences("DATA", MODE_PRIVATE).edit();
            editor.putString("NAME", userName);
            editor.apply();
        }
        else {
            Log.d(TAG, "Try again");
        }
    }
}

我见过适用于 iOS 和 Web 的解决方案,但我使用的是 Android。

我该如何解决这个问题?

如果您需要其他详细信息,请随时发表评论。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。

您需要将生成的令牌的 Value 列下的值粘贴到 Firebase Application Secret 中,不是Secret Id 列下的值: enter image description here

所以如果你看不到你的,你可以生成一个新的。