[英]Did anyone manage to get the id token from google sign in (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=驗證該令牌時mytoken和https://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.