簡體   English   中英

通過使用 google_sign_in 刷新令牌獲取新令牌 Flutter

[英]Obtain a new token by refresh token with google_sign_in Flutter

我正在編寫一個從 Flutter 調用 google fit rest api 的應用程序。

我需要使用 ( https://pub.dev/packages/google_sign_in ) 與谷歌簽名。 我可以毫無問題地獲得令牌(請參閱是否有人設法從谷歌登錄(Flutter)獲取 ID 令牌)但是如何在過期時獲取新令牌?

我不想要求用戶每小時登錄並獲取一個新令牌

您可以通過 2 種方式做到這一點。

  1. 您可以使用API

  2. 我不知道這是否是標准的,但您可以在每次用戶打開應用程序時進行靜默silent login ,靜默日志無需用戶交互即可登錄用戶帳戶,這樣您就有了一個新令牌。 像這樣:

Future<String> refreshToken() async {
    print("Token Refresh");
    final GoogleSignInAccount googleSignInAccount =
        await googleSignIn.signInSilently();
    final GoogleSignInAuthentication googleSignInAuthentication =
        await googleSignInAccount.authentication;

    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleSignInAuthentication.accessToken,
      idToken: googleSignInAuthentication.idToken,
    );
    final AuthResult authResult = await auth.signInWithCredential(credential);

    return googleSignInAuthentication.accessToken; // New refreshed token
  }

手動獲取刷新令牌

apiKey - 來自 firebase 的 api 密鑰,idToken - 未過期的 ID 令牌,提供商 - 'google.com'、'apple.com' 等

final url = Uri.parse('https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp?key=$apiKey');

final response = await http.post(
  url,
  headers: {'Content-type': 'application/json'},
  body: jsonEncode({
    'postBody': 'id_token=$token&providerId=$provider',
    'requestUri': 'http://localhost',
    'returnIdpCredential': true,
    'returnSecureToken': true
  })
);
if (response.statusCode != 200) {
  throw 'Refresh token request failed: ${response.statusCode}';
}

final data = Map<String, dynamic>.of(jsonDecode(response.body));
if (data.containsKey('refreshToken')) {
   // here is your refresh token, store it in a secure way
} else {
  throw 'No refresh token in response';
}

暫無
暫無

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

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