public class WaveLabsController { private static String URL_LENS_APEX = '/analytics/wave/web/lens.apexp'; public static String URL_HEROKU = 'https://www.jumpstartwave.com'; private static String URL_HEROKU_ENCRYPT_ENDPOINT = 'encryptToken'; private String org; private String sid; public String getOrg() { return org; } public void setOrg(String o) { org = o; } public String getSid() { return sid; } public void setSid(String id) { sid = id; } public WaveLabsController() { String forwardedHeader = ApexPages.currentPage().getHeaders().get('X-Salesforce-Forwarded-To'); org = 'https://' + ((forwardedHeader == null) ? ApexPages.currentPage().getHeaders().get('host') : forwardedHeader); sid = getSessionIdFromLensApex(); // Even though URL params are SSL-encrypted over the wire, in case web logs show unencrypted... sid = encryptString(sid); } // Encrypt on Heroku via POST call: log lines shouldn't not contain the unencrypted session id private String encryptString(String s) { HttpRequest req = new HttpRequest(); Http http = new Http(); HTTPResponse res; String resp; // Get dashboard definition req.setMethod('POST'); req.setHeader('content-type', 'application/json'); req.setEndpoint(WaveLabsController.URL_HEROKU + '/' + WaveLabsController.URL_HEROKU_ENCRYPT_ENDPOINT); req.setBody('{"token": "' + s + '"}'); if(test.isRunningTest()) { resp = '123456'; } else { res = http.send(req); resp = res.getBody(); } // This is to identify session IDs that are encrypted. // If you hit wave labs directly, this won't exist. String suffix = 'wavelabs'; return resp + suffix; } // This is a bit of a hack. Remove once dashboard public API is available // lens.apexp contains the OAuth token // UserInfo.getSessionId() is not a first-class token in unmanaged packages // so it will fail for the /insights... "private" API calls public String getSessionIdFromLensApex() { String homeContent; PageReference home = new PageReference(org + WaveLabsController.URL_LENS_APEX); if(test.isRunningTest()) { homeContent = 'Some random string'; } else { blob homeblob = home.getContent(); homeContent = homeblob.toString(); } Matcher m = Pattern.compile('\"OAuth \" [+] \"([\\w!.]+)').matcher(homeContent); if(m.find()) { return m.group(1); } else { return UserInfo.getSessionId(); } } }