How to verify JWT from AWS Cognito in the API backend?

后端 未结 10 553
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-12 11:17

I\'m building a system consisting of an Angular2 single page app and a REST API running on ECS. The API runs on .Net/Nancy, but that might well change.

I would like

相关标签:
10条回答
  • 2020-12-12 11:42

    Someone also wrote a python package called cognitojwt that works in both async/sync mode to decode and verify Amazon Cognito JWT.

    0 讨论(0)
  • 2020-12-12 11:45

    You can get insights from the Lambda code here

    https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html

    https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt

    In Golang https://gist.github.com/tmaiaroto/e2ee5e88fc6ae035307d7c5ee71a99cf

    0 讨论(0)
  • 2020-12-12 11:48

    I had a similar problem but without using the API Gateway. In my case I wanted to verify the signature of a JWT token obtained via the AWS Cognito Developer Authenticated identity route.

    Like many posters on various sites I had trouble piecing together exactly the bits I needs to verify the signature of an AWS JWT token externally i.e., server side or via script

    I think I figured out out and put a gist to verify an AWS JWT token signature. It'll verify an AWS JWT/JWS token with either pyjwt or PKCS1_v1_5c from Crypto.Signature in PyCrypto

    So, yes this was python in my case but it's also doable easily in node (npm install jsonwebtoken jwk-to-pem request).

    I attempted to highlight some gotchas in the comments because when I was trying to figure this out I was mostly doing the right thing but there were some nuances like python dict ordering, or lack there of, and json representation.

    Hopefully it may help somebody somewhere.

    0 讨论(0)
  • 2020-12-12 11:48

    This is based on the elaborate explanation from Derek (answer). I have been able to create a working sample for PHP.

    I have used https://github.com/firebase/php-jwt for pem creation and code verification.

    This code is used after you received a set of base64 encoded tokens.

    <?php
    
    require_once(__DIR__ . '/vendor/autoload.php');
    
    use Firebase\JWT\JWT;
    use Firebase\JWT\JWK;
    use Firebase\JWT\ExpiredException;
    use Firebase\JWT\SignatureInvalidException;
    use Firebase\JWT\BeforeValidException;
    
    function debugmsg($msg, $output) {
        print_r($msg . "\n");
    }
    
    $tokensReceived = array(
        'id_token' => '...',
        'access_token' => '...',
        'refresh_token' => '...',
        'expires_in' => 3600,
        'token_type' => 'Bearer'
    );
    
    $idToken = $tokensReceived['id_token'];
    
    // 'https://cognito-idp.us-west-2.amazonaws.com/<pool-id>/.well-known/jwks.json'
    $keys = json_decode('<json string received from jwks.json>');
    
    $idTokenHeader = json_decode(base64_decode(explode('.', $idToken)[0]), true);
    print_r($idTokenHeader);
    
    $remoteKey = null;
    
    $keySets = JWK::parseKeySet($keys);
    
    $remoteKey = $keySets[$idTokenHeader['kid']];
    
    try {
        print_r("result: ");
        $decoded = JWT::decode($idToken, $remoteKey, array($idTokenHeader['alg']));
        print_r($decoded);
    } catch(Firebase\JWT\ExpiredException $e) {
        debugmsg("ExpiredException","cognito");
    } catch(Firebase\JWT\SignatureInvalidException $e) {
        debugmsg("SignatureInvalidException","cognito");
    } catch(Firebase\JWT\BeforeValidException $e) {
        debugmsg("BeforeValidException","cognito");
    }
    
    ?>
    
    0 讨论(0)
提交回复
热议问题