Skip to content

Commit 1d5a2d3

Browse files
committed
generate jwt
Signed-off-by: Andrew Mak <[email protected]>
1 parent f1c7d0a commit 1d5a2d3

File tree

4 files changed

+55
-4
lines changed

4 files changed

+55
-4
lines changed

.factorypath

+5-2
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,17 @@
7676
<factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.10.3/jackson-dataformat-yaml-2.10.3.jar" enabled="true" runInBatchMode="false"/>
7777
<factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar" enabled="true" runInBatchMode="false"/>
7878
<factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.3/jackson-datatype-jsr310-2.10.3.jar" enabled="true" runInBatchMode="false"/>
79-
<factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar" enabled="true" runInBatchMode="false"/>
80-
<factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.10.3/jackson-databind-2.10.3.jar" enabled="true" runInBatchMode="false"/>
8179
<factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.10.3/jackson-core-2.10.3.jar" enabled="true" runInBatchMode="false"/>
8280
<factorypathentry kind="VARJAR" id="M2_REPO/io/fabric8/zjsonpatch/0.3.0/zjsonpatch-0.3.0.jar" enabled="true" runInBatchMode="false"/>
8381
<factorypathentry kind="VARJAR" id="M2_REPO/com/github/mifmif/generex/1.0.2/generex-1.0.2.jar" enabled="true" runInBatchMode="false"/>
8482
<factorypathentry kind="VARJAR" id="M2_REPO/dk/brics/automaton/automaton/1.11-8/automaton-1.11-8.jar" enabled="true" runInBatchMode="false"/>
8583
<factorypathentry kind="VARJAR" id="M2_REPO/io/fabric8/openshift-client/4.10.3/openshift-client-4.10.3.jar" enabled="true" runInBatchMode="false"/>
8684
<factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.15/commons-codec-1.15.jar" enabled="true" runInBatchMode="false"/>
85+
<factorypathentry kind="VARJAR" id="M2_REPO/org/bouncycastle/bcpkix-jdk15on/1.68/bcpkix-jdk15on-1.68.jar" enabled="true" runInBatchMode="false"/>
86+
<factorypathentry kind="VARJAR" id="M2_REPO/org/bouncycastle/bcprov-jdk15on/1.68/bcprov-jdk15on-1.68.jar" enabled="true" runInBatchMode="false"/>
87+
<factorypathentry kind="VARJAR" id="M2_REPO/com/auth0/java-jwt/3.12.0/java-jwt-3.12.0.jar" enabled="true" runInBatchMode="false"/>
88+
<factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.10.5.1/jackson-databind-2.10.5.1.jar" enabled="true" runInBatchMode="false"/>
89+
<factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.10.5/jackson-annotations-2.10.5.jar" enabled="true" runInBatchMode="false"/>
8790
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-slf4j-impl/2.13.3/log4j-slf4j-impl-2.13.3.jar" enabled="true" runInBatchMode="false"/>
8891
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar" enabled="true" runInBatchMode="false"/>
8992
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-core/2.13.3/log4j-core-2.13.3.jar" enabled="true" runInBatchMode="false"/>

config/build.sh

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ YAML=900-integrations.yaml
55
echo "---" > $YAML
66
kamel run --name github-app \
77
-d mvn:commons-codec:commons-codec:1.15 \
8+
-d mvn:org.bouncycastle:bcpkix-jdk15on:1.68 \
9+
-d mvn:com.auth0:java-jwt:3.12.0 \
810
../src/main/java/GitHubApp.java \
911
../src/main/java/CallbackHandler.java \
1012
../src/main/java/EventsHandler.java \

pom.xml

+10
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@
5252
<artifactId>commons-codec</artifactId>
5353
<version>1.15</version>
5454
</dependency>
55+
<dependency>
56+
<groupId>org.bouncycastle</groupId>
57+
<artifactId>bcpkix-jdk15on</artifactId>
58+
<version>1.68</version>
59+
</dependency>
60+
<dependency>
61+
<groupId>com.auth0</groupId>
62+
<artifactId>java-jwt</artifactId>
63+
<version>3.12.0</version>
64+
</dependency>
5565

5666
<!-- logging -->
5767
<dependency>

src/main/java/EventsHandler.java

+38-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
// camel-k: language=java
22

3+
import java.io.IOException;
4+
import java.io.StringReader;
35
import java.security.GeneralSecurityException;
6+
import java.security.KeyPair;
47
import java.security.MessageDigest;
58
import java.security.SignatureException;
9+
import java.security.interfaces.RSAPrivateKey;
610
import java.util.Base64;
711
import java.util.Base64.Decoder;
812
import java.util.Map;
913

1014
import javax.crypto.Mac;
1115
import javax.crypto.spec.SecretKeySpec;
1216

17+
import com.auth0.jwt.JWT;
18+
import com.auth0.jwt.algorithms.Algorithm;
19+
import com.auth0.jwt.exceptions.JWTCreationException;
20+
1321
import org.apache.camel.Exchange;
1422
import org.apache.camel.ExchangeProperty;
1523
import org.apache.camel.Header;
@@ -18,6 +26,9 @@
1826
import org.apache.camel.support.builder.PredicateBuilder;
1927
import org.apache.commons.codec.DecoderException;
2028
import org.apache.commons.codec.binary.Hex;
29+
import org.bouncycastle.openssl.PEMKeyPair;
30+
import org.bouncycastle.openssl.PEMParser;
31+
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
2132

2233
import io.fabric8.kubernetes.api.model.Secret;
2334

@@ -49,6 +60,28 @@ void validateSignature(
4960
log.info("-> Signature {} is valid", signature);
5061
}
5162

63+
String generateJWT(
64+
@ExchangeProperty(GitHubApp.PEM) String pem,
65+
@ExchangeProperty("app_id") String appId)
66+
throws IOException {
67+
68+
try (PEMParser parser = new PEMParser(new StringReader(pem))) {
69+
70+
// read the private key
71+
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
72+
KeyPair kp = converter.getKeyPair((PEMKeyPair) parser.readObject());
73+
RSAPrivateKey key = (RSAPrivateKey) kp.getPrivate();
74+
75+
// create and sign JWT with private key
76+
return JWT.create()
77+
.withIssuer(appId)
78+
.sign(Algorithm.RSA256(null, key));
79+
}
80+
catch (JWTCreationException e) {
81+
throw new IOException("Error creating JWT token", e);
82+
}
83+
}
84+
5285
@Override
5386
public void configure() throws Exception {
5487

@@ -77,6 +110,7 @@ public void configure() throws Exception {
77110

78111
.onException(DecoderException.class)
79112
.onException(GeneralSecurityException.class)
113+
.onException(IOException.class)
80114
.handled(true)
81115
.removeHeaders("*")
82116
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(404))
@@ -90,9 +124,10 @@ public void configure() throws Exception {
90124
// get app secrets
91125
.to("direct:get-secret")
92126

127+
// validate the event and request for an access token
93128
.bean(this, "validateSignature")
94-
// TODO: generate JWT
95-
// TODO: request access token
129+
.setProperty("jwt", method(this, "generateJWT"))
130+
.log("TODO: ${exchangeProperty[jwt]}") // TODO: request access token
96131

97132
// restore original payload
98133
.setBody(exchangeProperty("payload"))
@@ -113,6 +148,7 @@ public void configure() throws Exception {
113148
Map<String, String> data = secret.getData();
114149

115150
exchange.setProperty(GitHubApp.WEBHOOK_SECRET, decoder.decode(data.get(GitHubApp.WEBHOOK_SECRET)));
151+
exchange.setProperty(GitHubApp.PEM, decoder.decode(data.get(GitHubApp.PEM)));
116152
}
117153
});
118154
}

0 commit comments

Comments
 (0)