Firebase 令牌身份验证错误
Posted
技术标签:
【中文标题】Firebase 令牌身份验证错误【英文标题】:Firebase Token Authentication error 【发布时间】:2017-02-24 17:59:38 【问题描述】:我正在使用 firebase 存储上传文件,但是当我上传时出现此错误
E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.android.gms.internal.zzand: Please sign in before trying to get a token.
我用谷歌搜索了它,但无法得到答案! 我已在 firebase 中登录。
【问题讨论】:
您能否发布一些额外的代码,以便我们看看您实际在做什么并最好重现它?有关更多信息,请参阅***.com/help/mcve :) 【参考方案1】:我认为您在上传文件之前没有签名。在启动器活动的 onCreate() 中,试试这个代码
FirebaseAuth mAuth = FirebaseAuth.getInstance();
然后在onStart()中,
FirebaseUser user = mAuth.getCurrentUser();
if (user != null)
// do your stuff
else
signInAnonymously();
匿名签名()
private void signInAnonymously()
mAuth.signInAnonymously().addOnSuccessListener(this, new OnSuccessListener<AuthResult>()
@Override
public void onSuccess(AuthResult authResult)
// do your stuff
)
.addOnFailureListener(this, new OnFailureListener()
@Override
public void onFailure(@NonNull Exception exception)
Log.e(TAG, "signInAnonymously:FAILURE", exception);
);
这可能会解决您的问题
注意:最初在您的 Firebase 项目中启用匿名登录。认证 -> 登录方式
【讨论】:
总是出现 onFailure :-( 您需要通过 Firebase 控制台中的“Authentication->SIGN-IN METHOD”启用匿名登录,您的应用才能执行此操作。 没错,您需要在项目中启用“匿名”作为“登录方法”之一。您不需要实现 .signInAnonymously(),只要您的存储规则允许未经身份验证的写入,它就可以在没有它的情况下工作。我对同样的错误消息感到困惑,但我相信它只会在你无论如何都会被拒绝时发生...... 在执行此操作之前,请确保您的 Gradle(模块)中有此依赖项: implementation 'com.google.firebase:firebase-storage:10.2.0' implementation 'com.google.firebase:firebase -auth:10.2.0' 实施 'com.google.firebase:firebase-core:10.2.0' 实施 'com.google.firebase:firebase-database:10.2.0' 实施 'com.firebase:firebase-client-android :2.4.0' 之后,在 Firebase 控制台(登录选项卡)中启用正确的登录提供程序【参考方案2】:我遇到了同样的问题,这是因为默认情况下,firebase 只允许上传已通过身份验证的用户的文件。
在 storage util 异常上方可能有类似这样的日志:
E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.android.gms.internal.zzajb: Please sign in before trying to get a token.
我们有自己的身份验证过程,不使用 firebase,因此我们决定更改 firebase 控制台中的存储规则。
service firebase.storage
match /b/bucket/o
match /allPaths=**
allow read, write;
注意:更改规则将允许任何用户将文件上传到您的 Firebase 云服务器。
【讨论】:
尽管我可以上传和下载文件,但即使使用这些设置,我也会收到此异常消息【参考方案3】:也许您只是无法“开始”使用 Firebase。我说是因为我创建了一个项目,通过 Android Studio IDE 连接到 firebase 存储,但我必须在控制台上手动“开始”。
【讨论】:
【参考方案4】:以下步骤对我有用:
从带有包 ID 的 firebase 生成正确的 google-services.json
在 build.gradle(app) 中
dependencies
compile 'com.google.firebase:firebase-storage:10.2.0'
compile 'com.google.firebase:firebase-auth:10.2.0'
compile 'com.google.firebase:firebase-core:10.2.0'
compile 'com.google.firebase:firebase-database:10.2.0'
compile 'com.firebase:firebase-client-android:2.4.0'
确保在 build.gradle(项目根文件夹)中添加以下依赖项
dependencies
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.google.gms:google-services:3.0.0'
在您的活动中下载文件时添加以下代码:
// Declaration reference
private StorageReference storageRef;
private void downloadImageFromFireBase()
showProgressDialog("Downloading image..");
storageRef = storage.getReferenceFromUrl("gs://XXX.appspot.com/").child("av"+ datePassed +".jpg");
showImageFromFireBaseDataBase();
private void showImageFromFireBaseDataBase()
try
final File localFile = File.createTempFile("images", "jpg");
final Bitmap[] bitmap = new Bitmap[1];
storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>()
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot)
Log.e("Test", "success!");
bitmap[0] = BitmapFactory.decodeFile(localFile.getAbsolutePath());
raysImage.setImageBitmap(bitmap[0]);
).addOnFailureListener(new OnFailureListener()
@Override
public void onFailure(@NonNull Exception exception)
Log.e("Test", "fail :( " + exception.getMessage());
);
catch(IOException e)
Log.e("ImageView",e.toString());
【讨论】:
这里提供的答案帮助我在回收视图适配器中,谢谢【参考方案5】:您必须先登录 FirebaseAuth。
您可以匿名登录,
但如果您想登录用户的 google id,请尝试这样。
我创建了一个易于使用的管理器类。
-
制作(您的)GoogleUserManager 类
object YourGoogleUserManager
private lateinit var gso: GoogleSignInOptions
private lateinit var firebaseAuth: FirebaseAuth
fun init(context: Context)
firebaseAuth = FirebaseAuth.getInstance()
gso = GoogleSignInOptions
.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(context.getString(R.string.default_web_client_id))
.build()
fun startGoogleSignInForResult(
fragment: Fragment,
onSuccess: (AuthResult) -> Unit,
onFail: (Exception) -> Unit
): ActivityResultLauncher<Intent>
return fragment.registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
)
val task = GoogleSignIn.getSignedInAccountFromIntent(it.data)
handleGoogleSignInResult(task, onSuccess, onFail)
fun signIn(
activityResultLauncher: ActivityResultLauncher<Intent>,
activity: Activity
)
val googleSignInClient = GoogleSignIn.getClient(activity, gso)
activityResultLauncher.launch(googleSignInClient.signInIntent)
private fun handleGoogleSignInResult(
task: Task<GoogleSignInAccount>,
onSuccess: (AuthResult) -> Unit,
onFail: (Exception) -> Unit
)
try
val account = task.getResult(ApiException::class.java)
val credential = GoogleAuthProvider.getCredential(account?.idToken, null)
firebaseAuth.signInWithCredential(credential)
.addOnSuccessListener
CatHolicLogger.log("success to firebase google sign in")
onSuccess(it)
.addOnFailureListener
CatHolicLogger.log("fail to firebase google sign in")
onFail(it)
catch (e: ApiException)
CatHolicLogger.log("fail to firebase google sign in")
onFail(e)
fun signOut()
firebaseAuth.signOut()
-
在您的应用程序中初始化管理器。
class YourApplication : Application()
...
override fun onCreate()
super.onCreate()
initGoogleUserManager()
...
private fun initGoogleUserManager()
YourGoogleUserManager.init(this)
-
在您的片段(或活动)中使用管理器
class YourFragment : Fragment()
...
...
private val startGoogleSignInForResult =
YourGoogleUserManager.startGoogleSignInForResult(this, onSuccess =
// your job after success to sign in
, onFail =
// your job after fail to sign in
)
...
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
super.onViewCreated(view, savedInstanceState)
binding.signInButton.setOnClickListener
YourGoogleUserManager.signIn(startGoogleSignInForResult, requireActivity())
【讨论】:
【参考方案6】:这可以像互联网连接一样简单,也就是说,如果您的所有代码都是正确的,并且您已经对 firebase 上的所有用户进行了身份验证。
【讨论】:
以上是关于Firebase 令牌身份验证错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Facebook 令牌的 Firebase Unity SDK 身份验证
使用 Firebase 身份验证进行身份验证后检索 Google 访问令牌