【问题标题】:Android Firebase: Microsoft Authentication FailureAndroid Firebase:Microsoft 身份验证失败
【发布时间】:2021-07-20 20:06:28
【问题描述】:

我的客户端 ID 我的客户端密码 我一直在尝试在我的应用程序中使用 Firebase 身份验证,Microsoft 作为提供商使用 Firebase Docs on how to authenticate with Microsoft。但是我在 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。

我该如何解决这个问题?

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

【问题讨论】:

    标签: java android firebase firebase-authentication


    【解决方案1】:

    我也遇到了同样的问题。

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

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

    【讨论】:

    • 感谢您的回答,但很抱歉,它不起作用。
    猜你喜欢
    • 2017-11-27
    • 2019-03-09
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多