Skip to content

Commit

Permalink
Adds credential refresh to MQTT example (#917)
Browse files Browse the repository at this point in the history
  • Loading branch information
gguuss authored and kurtisvg committed Nov 17, 2017
1 parent f64e4f3 commit 46724e2
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public static void main(String[] args) throws Exception {
// to authorize the device.
connectOptions.setUserName("unused");

System.out.println(options.algorithm);
DateTime iat = new DateTime();
if (options.algorithm.equals("RS256")) {
connectOptions.setPassword(
createJwtRsa(options.projectId, options.privateKeyFile).toCharArray());
Expand Down Expand Up @@ -161,6 +161,24 @@ public static void main(String[] args) throws Exception {
"Publishing %s message %d/%d: '%s'\n",
options.messageType, i, options.numMessages, payload);

// Refresh the connection credentials before the JWT expires.
long secsSinceRefresh = ((new DateTime()).getMillis() - iat.getMillis()) / 1000;
if (secsSinceRefresh > (options.tokenExpMins * 60)) {
System.out.format("\tRefreshing token after: %d seconds\n", secsSinceRefresh);
iat = new DateTime();
if (options.algorithm.equals("RS256")) {
connectOptions.setPassword(
createJwtRsa(options.projectId, options.privateKeyFile).toCharArray());
} else if (options.algorithm.equals("ES256")) {
connectOptions.setPassword(
createJwtEs(options.projectId, options.privateKeyFile).toCharArray());
} else {
throw new IllegalArgumentException(
"Invalid algorithm " + options.algorithm
+ ". Should be one of 'RS256' or 'ES256'.");
}
}

// Publish "payload" to the MQTT topic. qos=1 means at least once delivery. Cloud IoT Core
// also supports qos=0 for at most once delivery.
MqttMessage message = new MqttMessage(payload.getBytes());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class MqttExampleOptions {
String algorithm;
String cloudRegion = "us-central1";
int numMessages = 100;
int tokenExpMins = 20;
String mqttBridgeHostname = "mqtt.googleapis.com";
short mqttBridgePort = 8883;
String messageType = "event";
Expand Down Expand Up @@ -101,6 +102,13 @@ public static MqttExampleOptions fromFlags(String[] args) {
.hasArg()
.desc("MQTT bridge hostname.")
.build());
options.addOption(
Option.builder()
.type(Number.class)
.longOpt("token_exp_minutes")
.hasArg()
.desc("Minutes to JWT token refresh (token expiration time).")
.build());
options.addOption(
Option.builder()
.type(Number.class)
Expand Down Expand Up @@ -133,6 +141,10 @@ public static MqttExampleOptions fromFlags(String[] args) {
if (commandLine.hasOption("num_messages")) {
res.numMessages = ((Number) commandLine.getParsedOptionValue("num_messages")).intValue();
}
if (commandLine.hasOption("token_exp_minutes")) {
res.tokenExpMins =
((Number) commandLine.getParsedOptionValue("token_exp_minutes")).intValue();
}
if (commandLine.hasOption("mqtt_bridge_hostname")) {
res.mqttBridgeHostname = commandLine.getOptionValue("mqtt_bridge_hostname");
}
Expand Down

0 comments on commit 46724e2

Please sign in to comment.