簡體   English   中英

有沒有人設法從谷歌登錄 (Flutter) 獲取 id 令牌

[英]Did anyone manage to get the id token from google sign in (Flutter)

我正在嘗試將我的用戶與我的后端服務器連接起來,我使用了 flutter 的官方谷歌登錄插件中的示例: https://pub.dartlang.org/packages/google_sign_in

簽名過程很順利,我得到了用戶名和 email 等。但我需要 id 令牌來通過我的服務器對用戶進行身份驗證。

ps:沒有使用firebase,只能google登錄。

誰能指導我如何獲得 id 令牌?

你可以嘗試使用這個

 _googleSignIn.signIn().then((result){
          result.authentication.then((googleKey){
              print(googleKey.accessToken);
              print(googleKey.idToken);
              print(_googleSignIn.currentUser.displayName);
          }).catchError((err){
            print('inner error');
          });
      }).catchError((err){
          print('error occured');
      });

或者如果 id 令牌為空,則嘗試這樣,它對我有用。

正如文檔指出的那樣,您需要后端的 oauth2 客戶端 ID 來請求 idToken 或 serverAuthCode。

在身份驗證中從 firebase google sigin 復制 Web SDK 配置並將以下內容粘貼到 res/values/strings.xml,這應該可以

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="default_web_client_id">{Web app Client id goes here}</string>
</resources>

您可以像這樣更簡單地獲取訪問令牌和 id 令牌:

final result = await _googleSignIn.signIn();
final ggAuth = await result.authentication;
print(ggAuth.idToken);
print(ggAuth.accessToken);

或者您也可以將其添加到 try-catch 以處理錯誤。

try {
   final result = await _googleSignIn.signIn();
   final ggAuth = await result.authentication;
   print(ggAuth.idToken);
   print(ggAuth.accessToken);
} catch (error) {
  print(error);
}

檢索 Is idToken 為我工作:

1google-services.json文件必須放在/android/app/

2.你需要添加到你的/android/app/build.gradle

apply plugin: 'com.google.gms.google-services'

3.到/android/build.gradle

classpath 'com.google.gms:google-services:4.3.4'

就是這樣。 GoogleSignIn 將返回一個真實的 idToken 而不是 null。

字體: https ://github.com/flutter/flutter/issues/12140#issuecomment-348720774

我在這個問題上掙扎了大約一個月。 事實證明,即使用戶嘗試重新啟動應用程序,我也獲得了相同的訪問令牌。 這很痛苦,因為我的應用程序處理范圍,如果用戶在第一次登錄時錯過檢查一個或多個范圍,應用程序根本無法工作,即使他/她再次登錄並授予權限。

對我有用的解決方法:我調用了googleSignIn.currentUser.clearAuthCache()方法,然后調用了 googleSignIn.signInSilently googleSignIn.signInSilently() 這將返回一個可用於進一步身份驗證的 GoogleSignInAccount。 我的猜測是 clearAuthCache() 方法清除了令牌緩存,因此創建了一個新令牌。 這應該會為您提供一個新的訪問令牌並讓您的應用程序進行有效調用。

我真誠地請求谷歌開發者解決這個問題。 目前,這種解決方法是唯一有效的方法。

實現此目的的另一種更簡潔的方法:

late Map<String, dynamic> userObject = {};
var res = await _googleSignIn.signIn();
var googleKey = await res!.authentication;
userObject.addAll({
  'accessToken': googleKey.accessToken,
  'idToken': googleKey.idToken,
  'displayName': res.displayName ?? '',
  'email': res.email,
  'id': res.id,
  'avatarUrl': res.photoUrl ?? '',
  'serverAuthCode': res.serverAuthCode ?? '',
});

該問題可能與不使用 firebase 有關。 當您在 firebase 中注冊您的應用程序時,會提供一個 google-services.json 文件,您可以將其與 google_sign_in 一起使用(這是文檔中顯示的默認方式)。

嘗試在沒有 google-services.json 的情況下實現此功能時,我的令牌值為空,但成功登錄谷歌。

如果您不想使用 firebase,則必須跳過幾圈。

  • 在谷歌雲控制台中,注冊您的應用程序。
  • 然后確保您“在”您剛剛在頂部下拉菜單中創建的應用程序。
  • 在側邊欄菜單的“api 和服務”中,通過創建 Oauth 同意屏幕菜單,我不記得必須填寫很多字段,所以如果您不知道要輸入什么,請將它們留空。
  • 然后轉到側邊欄中的“憑據”菜單,單擊“創建新憑據”,然后選擇 OAuth2 客戶端 ID。 制作一個 Web 客戶端,即使您嘗試將它與 android/ios 應用程序一起使用。
  • 制作一個文件android/app/src/main/res/values/strings.xml
  • 使用我們剛剛制作的 Web 客戶端,將<?xml version="1.0" encoding="utf-8"?> <resources> <string name="default_web_client_id">YOUR WEB CLIENT ID</string> </resources>插入strings.xml 文件。
  • [編輯] 在 android 的 google 控制台中再創建一個客戶端,並放入本地機器的 sha1 密鑰。 如果您使用的是 firebase,此步驟會自動為您完成。 在這種情況下,您必須為您的 Android 設備創建一個 Web 客戶端和一個。 在生產中,您將為您的生產應用程序使用特定的客戶端。

我相信應該這樣做,可能錯過了一步。

我還想在后端驗證傳入的 idtoken 是否有效,因此我還必須創建一個服務帳戶(在 apis 和服務 -> 憑據頁面中)並在我的 go 服務器中使用它。

我仍然在努力讓它與 ios 一起使用,但 android 端效果很好。

嘗試這個:

當您創建 GoogleSignIn object 時:

GoogleSignIn(clientId: "你的客戶 ID")

我希望它有幫助;)

暫無
暫無

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

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