During any integration of NetSuite and Other application, we need to create tokens for providing a request to NetSuite over REST API. Considering the security, we need to generate NetSuite authentication token inside the application which we used to integrate with NetSuite. Here attaching the java program used to generate NetSuite Token Authentication for the application using JAVA (Example SalesForce-NS integration).
//Libraries for getAlphaNumericString
import java.util.Date;
import java.sql.Timestamp;
//Libraries for encodeURIComponent
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
//Libraries for calculateRFC2104HMAC
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.util.Formatter;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
//Libraries for Base64
import java.util.Base64;
import java.util.Base64.Encoder;
import java.util.Base64.Decoder;
public class GenerateToeknBasedAuth {
private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
public static void main(String args[]) throws Exception {
String CONSUMER_KEY = "d5efb840eb014e36d8f84a6683c7b0cbd1937e674ef312cf3a06f44630f692ec";
String CONSUMER_SECRET = "d41b026fb31e3dc688ac18a0bb5ddebcbb74160335d424afed057f5b1aa8a420";
String TOKEN_ID = "28b73821c05f820fd5c4b7a5b3d010197e34c2ae02d92dcb76f6e40a3511f5fa";
String TOKEN_SECRET = "3680e8492988750573fd6baeafb706d87d511b58b1033fa83cf6a74ca86b8cb5";
String SCRIPT_DEPLOYMENT_ID = "1";
String OAUTH_NONCE = GenerateToeknBasedAuth.getAlphaNumericString(32);
String TIME_STAMP_TREAL = GenerateToeknBasedAuth.GetTimeStamp();
String TIME_STAMP = TIME_STAMP_TREAL.substring(0,10);
String OAUTH_VERSION = "1.0";
String SCRIPT_ID = "1703";
String HTTP_METHOD = "POST";
String BASE_URL = "https://rest.netsuite.com/app/site/hosting/restlet.nl";
String NETSUITE_ACCOUNT_ID = "TSTDRV1584391";
String data = "";
//data = data + "count=5&";
data = data + "deploy=" + SCRIPT_DEPLOYMENT_ID + "&";
data = data + "oauth_consumer_key=" + CONSUMER_KEY + "&";
data = data + "oauth_nonce=" + OAUTH_NONCE + "&";
data = data + "oauth_signature_method=" + "HMAC-SHA1" + "&";
data = data + "oauth_timestamp=" + TIME_STAMP + "&";
data = data + "oauth_token=" + TOKEN_ID + "&";
data = data + "oauth_version=" + OAUTH_VERSION + "&";
data = data + "script=" + SCRIPT_ID;
String encodedData = GenerateToeknBasedAuth.encodeURIComponent(data);
String completeData = HTTP_METHOD + "&" + encodeURIComponent(BASE_URL) + "&" + encodedData;
String hmacsha1Data = GenerateToeknBasedAuth.calculateRFC2104HMAC(completeData, CONSUMER_SECRET + "&" + TOKEN_SECRET);
String oauth_signature = GenerateToeknBasedAuth.encodeURIComponent(hmacsha1Data);
String OAuth = "OAuth oauth_signature=\"" + oauth_signature + "\",";
OAuth = OAuth + "oauth_version=\"1.0\",";
OAuth = OAuth + "oauth_nonce=\"" + OAUTH_NONCE + "\",";
OAuth = OAuth + "oauth_signature_method=\"HMAC-SHA1\",";
OAuth = OAuth + "oauth_consumer_key=\"" + CONSUMER_KEY + "\",";
OAuth = OAuth + "oauth_token=\"" + TOKEN_ID + "\",";
OAuth = OAuth + "oauth_timestamp=\"" + TIME_STAMP + "\",";
OAuth = OAuth + "realm=\"" + NETSUITE_ACCOUNT_ID + "\"";
String NS_Auth = OAuth;
System.out.println(NS_Auth);
}
// function to generate a random string of length n
static String getAlphaNumericString(int n) {
String AlphaNumericString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
int index
= (int)(AlphaNumericString.length() *
Math.random());
sb.append(AlphaNumericString
.charAt(index));
}
return sb.toString();
}
// function to generate TimeStamp
static String GetTimeStamp() {
Date date = new Date();
long time = date.getTime();
return String.valueOf(time);
}
// function to Encode URL
static String encodeURIComponent(String s) {
String result = null;
try {
result = URLEncoder.encode(s, "UTF-8")
.replaceAll("\\+", "%20")
.replaceAll("\\%21", "!")
.replaceAll("\\%27", "'")
.replaceAll("\\%28", "(")
.replaceAll("\\%29", ")")
.replaceAll("\\%7E", "~");
} catch (UnsupportedEncodingException e) {
result = s;
}
return result;
}
// Function to Sign the result string using the consumer secret and token secret concatenated using HmacSHA1
static String calculateRFC2104HMAC(String data, String key)
throws SignatureException, NoSuchAlgorithmException, InvalidKeyException {
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);
Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(signingKey);
// Encode HmacSHA1 using Base64
String Base64_Encoded_HMAC_SHA1_ALGORITHM = Base64.getEncoder().encodeToString(mac.doFinal(data.getBytes()));
return Base64_Encoded_HMAC_SHA1_ALGORITHM;
}
/* static String toHexString(byte[] bytes) {
Formatter formatter = new Formatter();
for (byte b: bytes) {
formatter.format("%02x", b);
}
return formatter.toString();
}
Private constructor to prevent this class from being instantiated.
private EncodingUtil()
{
super();
}*/
}