簡體   English   中英

Cognito - 檢查 idToken 的有效性

[英]Cognito - Check validity of idToken

我在 Node.js 中有一個后端 API,它從查詢參數中檢索 Amazon Cognito ID 令牌。 我需要檢查這個令牌是否有效。 有沒有辦法通過使用aws-sdkamazon-cognito-identity-js SDK 來檢查?

我為此苦苦掙扎了幾天,我才發現如何做到這一點,這是一個完整的工作功能,它為您進行驗證,您需要提供的是與您之前創建的認知池相關的 userPoolId 和 pool_region,然后您可以通過將令牌作為參數發送到您想要的任何地方調用此函數,如果令牌有效與否,您將在控制台上獲得結果,這是實現它的方法:

  1. 創建一個名為 tokenValidation.js 的文件(例如)
  2. 將此代碼粘貼到其中:

 // Cognito data const userPoolId = "###########"; // Cognito user pool id here const pool_region = '#########'; // Region where your cognito user pool is created const jwt = require('jsonwebtoken'); const jwkToPem = require('jwk-to-pem'); const request = require('request'); // Token verification function const ValidateToken = (token) => { console.log('Validating the token...') request({ url: `https://cognito-idp.${pool_region}.amazonaws.com/${userPoolId}/.well-known/jwks.json`, json: true }, (error, response, body) => { console.log('validation token..') if (!error && response.statusCode === 200) { pems = {}; var keys = body['keys']; for(var i = 0; i < keys.length; i++) { //Convert each key to PEM var key_id = keys[i].kid; var modulus = keys[i].n; var exponent = keys[i].e; var key_type = keys[i].kty; var jwk = { kty: key_type, n: modulus, e: exponent}; var pem = jwkToPem(jwk); pems[key_id] = pem; } //validate the token var decodedJwt = jwt.decode(token, {complete: true}); if (!decodedJwt) { console.log("Not a valid JWT token"); return; } var kid = decodedJwt.header.kid; var pem = pems[kid]; if (!pem) { console.log('Invalid token'); return; } jwt.verify(token, pem, function(err, payload) { if(err) { console.log("Invalid Token."); } else { console.log("Valid Token."); console.log(payload); } }); } else { console.log(error) console.log("Error! Unable to download JWKs"); } }); } // Exporting it to call it anywere you want exports.ValidateToken = ValidateToken

  1. 像這樣在需要時導入它: const validateToken = require('./tokenValidation')

  2. 最后這樣稱呼它: validateToken.ValidateToken(result.getAccessToken().getJwtToken())

我知道這是一個老問題,但我真的希望這對未來的其他人有所幫助。

我使用 AWS 庫https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt在帶有節點的 lambda 中進行檢查。

默認情況下,它會檢查 AccessToken,但您可以對其進行修改以驗證 IdToken。

代替 :

if (claim.token_use !== 'access') {
  throw new Error('claim use is not access');
}

經過

if (claim.token_use !== "id") {
  throw new Error("claim use is not id");
}

console.log(`claim confirmed for ${claim.username}`);
result = {userName: claim.username, clientId: claim.client_id, isValid: true};

經過

console.log(`claim confirmed for ${claim["cognito:username"]}`);
result = {userName: claim["cognito:username"], clientId: claim.aud, isValid: true};

您甚至可以在結果中添加更多自定義屬性。

Cognito 的 ID 令牌在解碼時包含一個“exp”聲明,它指示 ID 令牌在多長時間后無效。 引用 OpenID 的官方文檔

不得接受 ID 令牌進行處理的到期時間或之后的到期時間。 此參數的處理要求當前日期/時間必須在值中列出的到期日期/時間之前。

要在 JavaScript 中解碼 JWT 令牌,您可以參考Auth0提供的 JsonWebToken 之類的庫。

要使用該庫使用上述庫解碼現有 ID 令牌,您可以參考以下代碼片段:

// get the decoded payload ignoring signature, no secretOrPrivateKey needed
var decoded = jwt.decode(token);

// get the decoded payload and header
var decoded = jwt.decode(token, {complete: true});
console.log(decoded.header);
console.log(decoded.payload) 

請注意,Cognito 生成的 JWT 令牌符合 OIDC,您還可以參考此文檔了解有關 Cognito 令牌的更多信息。

亞馬遜有一個庫來解碼和驗證 Cognito 令牌: https ://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt

只需您可以使用aws-sdk CognitoIdentityServiceProvider檢查

var params = {   AccessToken: 'STRING_VALUE' /* required */ };
 cognitoidentityserviceprovider.getUser(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else     console.log(data);           // successful response });
});

AWS 官方庫 aws-jwt-verify。

import { CognitoJwtVerifier } from "aws-jwt-verify";

const verifier = CognitoJwtVerifier.create({
    userPoolId: "user-pool-id",
    tokenUse: "access",
    clientId: "client-id",
})

// If no error is thrown it is a valid token
await verifier.verify(JWT_TOKEN)

暫無
暫無

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

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