createJwt function

Future<String?> createJwt()

Implementation

Future<String?> createJwt() async {
  try {
    // Get the public key.
    final publicKey = await SecureP256.getPublicKey(_alias);

    // Get the public key, raw representation.
    final rawPublicKey = publicKey.rawKey;

    // Extract the x and y coordinates.
    final xCoordinateData = rawPublicKey.sublist(1, 33);
    final yCoordinateData = rawPublicKey.sublist(33, 65);

    // If you need base64-encoded strings for JWK:
    final xCoordinateBase64 = base64UrlEncoded(xCoordinateData);
    final yCoordinateBase64 = base64UrlEncoded(yCoordinateData);

    // Convert the public key to JWK format.
    var headers = {
      "typ": "dpop+jwt",
      "alg": "ES256",
      "jwk": {
        "kty": "EC",
        "crv": "P-256",
        "x": xCoordinateBase64,
        "y": yCoordinateBase64
      }
    };

    final headersData = utf8.encode(json.encode(headers));
    final headersB64 = base64UrlEncoded(headersData);

    // construct claims
    final iat = DateTime.now().millisecondsSinceEpoch ~/ 1000;
    var uuid = Uuid();
    final jti = uuid.v4().toLowerCase();

    final claims = {
      "iat": iat,
      "jti": jti
    };
    final claimsData = utf8.encode(json.encode(claims));
    final claimsB64 = base64UrlEncoded(claimsData);

    // sign
    final signingInput = headersB64 + "." + claimsB64;
    final signature = await SecureP256.sign(_alias, Uint8List.fromList(utf8.encode(signingInput)));

    final signatureB64 = base64UrlEncoded(signature);

    final jwt = signingInput + "." + signatureB64;

    return jwt;

  } catch (error) {
    // handle error
    print(error);
    return null;
  }
}