繁体   English   中英

web 中的 firebase google 身份验证在 android 应用程序 webview 上不起作用

[英]firebase google authentication in web does not work on android app webview

我正在创建一个使用 firebase google 身份验证登录的网站。 它在所有浏览器中都能正常工作。 但是当我在我的应用程序中将此网站添加为 webview 时,它不起作用。

显示此错误的网站:

运行此应用程序的环境不支持此操作。 “location.protocol”必须是 http、https 或 chrome-extension,并且必须启用网络存储。

这里有一些代码:

javascript代码:

function login(){
    console.log('login called');
    function newLoginHappend(user){
        if(user){
            model_questions(user);
        }else{
            var provider = new firebase.auth.GoogleAuthProvider();

            firebase.auth().signInWithPopup(provider).then(function(result) {
              // This gives you a Google Access Token. You can use it to access the Google API.
              var token = result.credential.accessToken;
              // The signed-in user info.
              var user = result.user;
              // ...
            }).catch(function(error) {
              // Handle Errors here.
              var errorCode = error.code;
              var errorMessage = error.message;
              // The email of the user's account used.
              var email = error.email;
              // The firebase.auth.AuthCredential type that was used.
              var credential = error.credential;
              // ...
            });
        }
    }

    firebase.auth().onAuthStateChanged(newLoginHappend);
}

window.onload = login();

网页浏览代码:

   WebSettings webSettings =webView.getSettings();
   webSettings.setJavaScriptEnabled(true);
   webView.setWebViewClient(new WebViewClient());
   webView.loadUrl("https://mahmud-cse16.github.io/CBAP_Handout/");

有什么方法或技术可以解决这个问题吗?? 如果您有任何想法,请与我们分享。

谢谢

尝试为 webview 启用 DOM Storage

WebSettings webSettings = myWebView.getSettings();
webSettings.setDomStorageEnabled(true);   // localStorage

设置是否启用 DOM 存储 API。 默认值为假。

Android 开发者参考

要解决“disallowed_useragent”错误,一种方法是使用 Android Google Auth SDK 在应用程序中本地登录,然后将 Google 令牌传递给 Webview,以便 Firebase 可以将其与auth.signInWithCredential()

它可能适用于其他提供商,但这是我在 Android 上使用 Google 身份验证的方法:

安卓:

val gso =
    GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
      .requestIdToken(clientId)
      .requestEmail()
      .build()
val googleSignInClient = GoogleSignIn.getClient(activity, gso)

activity.startActivityForResult(
        googleSignInClient.signInIntent,
        object : ActivityWithResultListener.OnActivityResultListener {
          override fun onActivityResult(resultCode: Int, data: Intent?) {
            if (data != null) {
              val credential = GoogleAuthProvider.getCredential(account.idToken!!, null)
              idToken = account.idToken!!

              // Then pass the token to your webview via a JS interface
            }
          }
       }
)


网站:

const idTokenFromApp = AndroidBridge.getAuthToken(); // This is the idToken from the Android code above
if (idTokenFromApp) {
    // from https://firebase.google.com/docs/auth/web/google-signin
    // Build Firebase credential with the Google ID token.
    // https://firebase.google.com/docs/reference/js/v8/firebase.auth.GoogleAuthProvider#static-credential
    const credential = firebase.auth.GoogleAuthProvider.credential(idTokenFromApp);

    // Sign in with credential from the Google user.
    firebase.auth.signInWithCredential(credential).catch((error) => {
      // Handle Errors here.
      const errorCode = error.code;
      const errorMessage = error.message;

      logError(`Error logging in: ${errorCode} ${errorMessage} token: ${idTokenFromApp}`, error);
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM