簡體   English   中英

“error_description”:令牌谷歌每次使用 flutter 登錄時的“無效值”

[英]"error_description": "Invalid Value" for token google sign in every time using flutter

我是 flutter 的新手,試圖為我的后端服務器從 google 訪問 auth 令牌,但每次令牌都無效。

我正在使用FirebaseUser user await user.getIdToken()我給了我一個令牌,但是當我嘗試使用我的后端服務器以及https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=驗證該令牌時mytokenhttps://www.googleapis.com/oauth2/v3/tokeninfo?access_token=mytoken這個鏈接給了我"error_description": "Invalid Value"

我不確定await user.getIdToken()這種方法是否適合獲取令牌。 其他人認為一切正常,我正在獲取除正確令牌之外的所有用戶信息。 如果有任何其他方式,請告訴我。

下面是我的代碼:

class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => new _LoginScreenState(); 
}

class _LoginScreenState extends State<LoginScreen> {
  final FirebaseAuth auth = FirebaseAuth.instance;
  final GoogleSignIn googleSignIn = new GoogleSignIn();
  Future<http.Response> socailLogin(String authToken) async {
    var url = "http://api.ourdomain.com/user/social/login/google";
    final response = await http.post(url,
    body: json.encode({"auth_token": authToken}),
    headers: {HttpHeaders.CONTENT_TYPE: "application/json"});
    return response;
  }

  Future<FirebaseUser> googleSignin() async {
  final GoogleSignInAccount googleSignInAccount = await 
  googleSignIn.signIn();

  final GoogleSignInAuthentication googleSignInAuthentication =
    await googleSignInAccount.authentication;

  final FirebaseUser firebaseUser = await auth.signInWithGoogle(
    accessToken: googleSignInAuthentication.accessToken,
    idToken: googleSignInAuthentication.idToken);
   return firebaseUser;
 }

@override
Widget build(BuildContext context) {
final logo = Hero(
  tag: 'hero',
  child: CircleAvatar(
    backgroundColor: Colors.transparent,
    radius: 48.0,
    child: Image.asset('assets/logo.png'),
  ),
);


final googleloginButton = Padding(
  padding: EdgeInsets.symmetric(vertical: 5.0),
  child: Material(
    borderRadius: BorderRadius.circular(30.0),
    //  shadowColor: Colors.lightBlueAccent.shade100,
    // elevation: 5.0,
    child: MaterialButton(
      minWidth: 200.0,
      height: 42.0,
      onPressed: () async {
        FirebaseUser user = await googleSignin();
         String idToken = await user.getIdToken();
        if (idToken != null) {

          final http.Response response = await socailLogin(idToken);
          if (response.statusCode == 200) {
            var authToken = json.decode(response.body)['token'];
            if (authToken != null) {
              storedToken(authToken);
            }
          } else {
            print("Response status: " + response.statusCode.toString());
            print("Response body: " + response.body);
            print("errror while request");
          }
        } else {
          print("in else part not get token id from google");
        }
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => HomeScreen(),
          ),
        );
      },
      color: Colors.red,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Icon(
            Icons.bug_report,
            color: Colors.white,
          ),
          Text('Connect with Google',
              style: TextStyle(color: Colors.white)),
        ],
      ),
    ),
  ),
);

 return Scaffold(
   backgroundColor: Colors.white,
   appBar: new AppBar(
     centerTitle: true,
     title: new Text("Login"),
   ),
   body: Center(
    child: ListView(
      shrinkWrap: true,
      padding: EdgeInsets.only(left: 24.0, right: 24.0),
      children: <Widget>[
        // logo,
        googleloginButton,
        facebookloginButton,
      ],
     ),
   ),
  );
 }
}

請幫助我。

對於后端服務器端驗證,必須使用可驗證的ID令牌來安全地獲取服務器端已登錄用戶的用戶ID。 REF。 https : //developers.google.com/identity/sign-in/web/backend-auth

似乎當前的Google抖動登錄插件不支持獲取用於后端服務器端OAuth驗證的AuthCode。 REF。 https : //github.com/flutter/flutter/issues/16613

我認為firebaseUser.getIdToken()不能用於Google API。

對於https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=mytoken ,您可能需要傳遞googleSignInAuthentication.idToken

對於https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=mytoken ,您可能需要傳遞googleSignInAuthentication.accessToken

獲取用戶信息(例如用戶ID)並將其傳遞到后端服務器端很容易受到黑客的攻擊。 您應該在Google API客戶端庫的后端服務器端驗證idToken。

我最近遇到了類似的問題。

這是我的代碼:

Future<void> googleLogin() async {
final googleUser = await googleSignIn.signIn();
if (googleUser == null) {
  print('no google user??');
  return;
}
_user = googleUser;

final googleAuth = await googleUser.authentication;
final credential = GoogleAuthProvider.credential(
    accessToken: googleAuth.accessToken);

try {
  await FirebaseAuth.instance.signInWithCredential(credential);
  
} catch (e) {
  print('could not sign in with goodle creds, and heres why: \n $e');
}

}

我沒有提供憑證變量中的所有信息。 所以我所要做的就是在那里添加 accessTokenId。 所以更換:

final credential = GoogleAuthProvider.credential(
    accessToken: googleAuth.accessToken);

和:

final credential = GoogleAuthProvider.credential(
    idToken: googleAuth.idToken, accessToken:    googleAuth.accessToken);

當它傳遞給 FirebaseAuth.instance 時,它起作用了。 這有什么幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM