簡體   English   中英

Google 登錄:后端驗證

[英]Google Sign-In: backend verification

我有谷歌登錄在我的應用程序上工作:相關代碼大致是:

var acc = await signInService.signIn();
var auth = await acc.authentication;
var token = auth.idToken;

這給了我一個很好的長令牌,然后我使用 HTTP POST 將其傳遞到我的后端(這工作正常),然后嘗試驗證。 我的 flutter 樹和后端服務器(即 nodejs/restify)中有相同的 google-services.json 文件。 后端代碼大致是:

let creds = require('./google-services.json');
let auth = require('google-auth-library').OAuth2Client;
let client = new auth(creds.client[0].oauth_client[0].client_id);
. . .
let ticket = await client.verifyIdToken({
    idToken: token,
    audience: creds.client[0].oauth_client[0].client_id
});
let payload = ticket.getPayload();

這始終返回我的錯誤“錯誤的收件人,有效負載受眾。= requiredAudience”。

我也嘗試過單獨注冊 GCP 控制台並改用這些密鑰/client_id,但結果相同。 在哪里可以找到可以正確驗證此令牌的有效 client_id?

這里的問題是client_id正被用於創建OAuth2Client和client_id被用作audienceverifyIdToken是一樣的。 client_idaudience應該是client_id這是在前端應用用於獲取id_token

以下是來自 Google 文檔的示例代碼。

const {OAuth2Client} = require('google-auth-library');
const client = new OAuth2Client(CLIENT_ID);
async function verify() {
  const ticket = await client.verifyIdToken({
      idToken: token,
      audience: CLIENT_ID,  // Specify the CLIENT_ID of the app that accesses the backend
      // Or, if multiple clients access the backend:
      //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
  });
  const payload = ticket.getPayload();
  const userid = payload['sub'];
  // If request specified a G Suite domain:
  //const domain = payload['hd'];
}
verify().catch(console.error);

這是文檔的鏈接

希望這可以幫助。

上面已經提到requiredAudience代替audience起作用,但我注意到requiredAudience{client_id: <CLIENT_ID>}和 <CLIENT_ID> 都起作用。 所以也許您引用的是creds.client[0].oauth_client[0]而不是creds.client[0].oauth_client[0].client_id 我無法找到任何關於requiredAudienceaudience之間區別的文檔,但是請確保您只發送 <CLIENT_ID> 而不是{client_id: <CLIENT_ID>}

谷歌文檔:鏈接

另一個快速解決方案可能是將您的參數“觀眾”的名稱更改為“requiredAudience”,它對我有用,如果您從谷歌復制代碼,則可能是谷歌文檔已過時。

client.verifyIdToken({
      idToken,
      requiredAudience: GOOGLE_CLIENT_ID,  // Specify the CLIENT_ID of the app that accesses the backend
      // Or, if multiple clients access the backend:
      //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
  });

verifyIdToken()的調用簽名不需要audience參數。 這也在變更日志中說明。 所以你可以跳過它,它會起作用。 該文檔對此有點誤導。

這也是使用requiredAudience起作用的原因,因為它實際上並沒有被該方法使用,所以它與不提供它是一樣的。

暫無
暫無

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

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