¿Cómo me conecto a Oracle Netsuite utilizando OAuth 2.0 Client Credentials Flow y JWT certificate con .net core?
Estoy intentando utilizar la API Rest de Netsuite. A continuación se detallan los pasos que he seguido.
https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_162730264820.html
- Creé un registro de integración en Netsuite
- Creé un certificado autofirmado:
openssl req -x509 -newkey rsa:4096 -sha256 -keyout auth-key.pem -out auth-cert.pem -nodes -days 730 - Añadí el auth-cert.pem a la integración en Netsuite
- Intenté llamar al endpoint TokenUrl para obtener el token de acceso
Sigo obteniendo una solicitud incorrecta (código de estado 400) cuando llamo a GetNetsuiteJwtAccessToken (string signedJWTAssertion) para obtener el token de acceso desde TokenUrl.
static void Main(string[] args)
//static string Scope = “rest_webservices”;
//static string Aud = “https://
//static string TokenUrl = “https://
//static string TenantName = “
//static string ClientId = "<clientid>";
//static string Issuer = ClientId;
//static string ClientSecret = "<client secret="">";
//static string AppId = "<appid>";
//static string Kid = "<key from="" the="" netsuite="" for="" the="" uploaded="" cert="">"";
{
var jwt= GenerateNetsuiteJWTFromPEMFile(“auth-key.pem”);
var accessToken = GetNetsuiteJwtAccessToken(signedJWTAssertion: jwt);
}
public static string GenerateNetsuiteJWTFromPEMFile(string PEMFile)
{
var tokenHandler = new JwtSecurityTokenHandler();
var rsaPem = File.ReadAllText(PEMFile);
var privatekey = RSA.Create();
privatekey.ImportFromPem(rsaPem);
var key = new RsaSecurityKey(privatekey);
//key.KeyId = Kid;
var signingCredentials = new SigningCredentials(
key: key,
algorithm: SecurityAlgorithms.RsaSha256
);
//signingCredentials.Key.KeyId = Kid;
var Now = DateTimeOffset.UtcNow;
var Exp = Now.AddMinutes(30).ToUnixTimeSeconds();
var Iat = Now.ToUnixTimeSeconds();
var jwt = new SecurityTokenDescriptor
{
Issuer = Issuer,
Claims = new Dictionary<string, object="">()
{
["iss"] = Issuer,
["scope"] = Scope,
["aud"] = Aud,
["exp"] = Exp,
["iat"] = Iat
},
SigningCredentials = signingCredentials
};
var jws = tokenHandler.CreateToken(jwt);
var encoded = new JwtSecurityTokenHandler().WriteToken(jws);
return encoded;
}
public static string GetNetsuiteJwtAccessToken(string signedJWTAssertion)
{
string accessToken;
HttpClient _httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.Clear();
var requestParams = new List<><string, string="">>
{
new KeyValuePair<string, string="">("grant_type", "client_credentials"),
new KeyValuePair<string, string="">("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer"),
new KeyValuePair<string, string="">("assertion", signedJWTAssertion)
};
using (var content = new FormUrlEncodedContent(requestParams))
{
var response = _httpClient.PostAsync(TokenUrl, content).Result;
var responseContent = response.Content.ReadAsStringAsync().Result;
accessToken = responseContent;
}
return accessToken;
}</string,></string,></string,></string,></string,></key></appid></client></clientid></tenant></tenant></tenant>
davy.ai
Consejos para la resolución de problemas utilizando la API de Rest Netsuite
Como experto en informática especializado en OAuth, JWT, clientes y credenciales de Netsuite, hay varias cosas a considerar al utilizar la API de Rest Netsuite.
Basado en los pasos anteriores tomados hasta ahora, revise las siguientes recomendaciones:
TokenUrl
sea precisa y que se hayan proporcionado las credenciales adecuadas paraClientId
yClientSecret
.rest_webservices
.RsaSha256
.Kid
utilizado para identificar el certificado es correcto y corresponde alKid
en Netsuite.Siguiendo los pasos anteriores, un usuario puede solucionar problemas y resolver cualquier problema que surja al intentar utilizar con éxito la API de Rest Netsuite.