[英]Google Sign-in using Angular app with a Node.js backend
[英]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
被用作audience
在verifyIdToken
是一樣的。 該client_id
的audience
應該是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
? 我無法找到任何關於requiredAudience
和audience
之間區別的文檔,但是請確保您只發送 <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]
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.