[{"data":1,"prerenderedAt":3761},["ShallowReactive",2],{"page-\u002Fblog\u002Fcustomizing-oauth2-parameters-servicenow-netsuite":3},{"id":4,"title":5,"author":6,"authorUrl":7,"body":8,"date":3723,"dateUpdated":91,"description":3724,"dqid":3725,"excerpt":3726,"extension":3727,"faq":3728,"headline":3741,"meta":3742,"navigation":197,"path":3743,"seo":3744,"socialImage":3745,"stem":3751,"tags":3752,"__hash__":3760},"content\u002Fblog\u002Fcustomizing-oauth2-parameters-servicenow-netsuite.md","Customizing OAuth2 Parameters in ServiceNow for NetSuite Integration | SN-Tricks","Gabriel Fordan","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fgabrielfordan",{"type":9,"value":10,"toc":3708},"minimark",[11,15,18,23,26,64,67,71,74,77,82,85,1540,1544,1547,1564,1568,1571,2258,2262,2265,2273,2733,2740,3018,3022,3025,3057,3061,3064,3068,3087,3091,3094,3114,3117,3694,3698,3701,3704],[12,13,14],"p",{},"When integrating ServiceNow with external systems using OAuth2, you might encounter scenarios where the default OAuth2 implementation doesn't quite meet the requirements of your authorization server. I recently faced this challenge while integrating ServiceNow with NetSuite, where the standard OAuth2 flow needed parameter modifications to work correctly.",[12,16,17],{},"In this post, I'll show you how to extend ServiceNow's OAuthUtil script include and customize the interceptRequestParameters function to modify OAuth2 token request parameters. This technique is particularly useful for NetSuite integrations but applies to any OAuth2 integration requiring custom parameter handling.",[19,20,22],"h2",{"id":21},"understanding-the-challenge","Understanding the Challenge",[12,24,25],{},"ServiceNow's OAuth2 implementation works well for most standard OAuth2 flows. However, some systems like NetSuite have specific requirements that don't align perfectly with ServiceNow's defaults. According to Oracle's documentation, NetSuite's OAuth2 implementation requires:",[27,28,29,37,43,49,55,58,61],"ul",{},[30,31,32,36],"li",{},[33,34,35],"strong",{},"code_verifier with SHA256 hashing",": NetSuite requires the code_verifier parameter to be hashed using SHA256",[30,38,39,42],{},[33,40,41],{},"code_verifier length validation",": The code_verifier must be between 43 and 128 characters",[30,44,45,48],{},[33,46,47],{},"code_challenge_method must be SHA256",": When using code_challenge, the code_challenge_method parameter must be set to 'S256'",[30,50,51,54],{},[33,52,53],{},"PKCE parameter relationship",": If code_challenge is configured, code_challenge_method is mandatory",[30,56,57],{},"Specific parameter formats for grant types",[30,59,60],{},"Custom scope definitions",[30,62,63],{},"Additional custom parameters for token exchange",[12,65,66],{},"The default ServiceNow OAuth2 flow doesn't provide a straightforward way to modify these parameters through configuration alone. This is where extending the OAuthUtil script include becomes essential.",[19,68,70],{"id":69},"the-solution-extending-oauthutil","The Solution: Extending OAuthUtil",[12,72,73],{},"ServiceNow provides the OAuthUtil script include as part of its OAuth2 implementation. By creating a custom script include that extends OAuthUtil, we can override the interceptRequestParameters function to modify request parameters before they're sent to the authorization server.",[12,75,76],{},"Here's how to implement this solution:",[78,79,81],"h3",{"id":80},"step-1-create-a-custom-script-include","Step 1: Create a Custom Script Include",[12,83,84],{},"First, create a new Script Include that extends OAuthUtil:",[86,87,92],"pre",{"className":88,"code":89,"language":90,"meta":91,"style":91},"language-javascript shiki shiki-themes github-light github-light","var CustomOAuthUtil = Class.create();\nCustomOAuthUtil.prototype = Object.extendsObject(OAuthUtil, {\n    initialize: function() {\n        OAuthUtil.prototype.initialize.call(this);\n    },\n\n    interceptRequestParameters: function(requestParameterMap, flow, providerName) {\n        \u002F\u002F Log the incoming parameters for debugging\n        gs.info('CustomOAuthUtil: Intercepting parameters for provider: ' + providerName);\n        gs.info('CustomOAuthUtil: Flow type: ' + flow);\n        gs.info('CustomOAuthUtil: Original parameters: ' + JSON.stringify(requestParameterMap));\n\n        \u002F\u002F Call the parent method first\n        OAuthUtil.prototype.interceptRequestParameters.call(this, requestParameterMap, flow, providerName);\n\n        \u002F\u002F Customize parameters based on provider name\n        if (providerName == 'NetSuite OAuth Provider') {\n            this._customizeNetSuiteParameters(requestParameterMap, flow);\n        }\n\n        return requestParameterMap;\n    },\n\n    _customizeNetSuiteParameters: function(requestParameterMap, flow) {\n        \u002F\u002F Handle different OAuth flows\n        if (flow == 'authorization_code') {\n            \u002F\u002F NetSuite specific modifications for authorization code flow\n            \n            \u002F\u002F Modify grant_type format if needed\n            if (requestParameterMap.containsKey('grant_type')) {\n                var grantType = requestParameterMap.get('grant_type');\n                gs.info('CustomOAuthUtil: Original grant_type: ' + grantType);\n                requestParameterMap.put('grant_type', 'authorization_code');\n            }\n\n            \u002F\u002F NetSuite requires code_verifier to be SHA256 hashed with specific length\n            if (requestParameterMap.containsKey('code_verifier')) {\n                var codeVerifier = requestParameterMap.get('code_verifier');\n                gs.info('CustomOAuthUtil: Processing code_verifier for NetSuite');\n                \n                \u002F\u002F Validate code_verifier length (43-128 characters)\n                if (codeVerifier.length \u003C 43 || codeVerifier.length > 128) {\n                    gs.error('CustomOAuthUtil: code_verifier length must be between 43 and 128 characters. Current length: ' + codeVerifier.length);\n                    \u002F\u002F Generate a new compliant code_verifier if needed\n                    codeVerifier = this._generateCompliantCodeVerifier();\n                }\n                \n                \u002F\u002F Apply SHA256 hash to code_verifier\n                var hashedVerifier = this._hashCodeVerifier(codeVerifier);\n                requestParameterMap.put('code_verifier', hashedVerifier);\n                gs.info('CustomOAuthUtil: Applied SHA256 hash to code_verifier');\n            }\n\n            \u002F\u002F NetSuite requires code_challenge_method to be SHA256 when code_challenge is present\n            if (requestParameterMap.containsKey('code_challenge')) {\n                \u002F\u002F Ensure code_challenge_method is set to S256\n                requestParameterMap.put('code_challenge_method', 'S256');\n                gs.info('CustomOAuthUtil: Set code_challenge_method to S256 for NetSuite');\n                \n                \u002F\u002F If code_challenge exists but code_challenge_method doesn't, add it\n                if (!requestParameterMap.containsKey('code_challenge_method')) {\n                    gs.warn('CustomOAuthUtil: code_challenge present without code_challenge_method - adding S256');\n                    requestParameterMap.put('code_challenge_method', 'S256');\n                }\n            }\n\n            \u002F\u002F Modify scope format\n            if (requestParameterMap.containsKey('scope')) {\n                var scope = requestParameterMap.get('scope');\n                \u002F\u002F NetSuite expects space-separated scopes\n                scope = scope.replace(\u002F,\u002Fg, ' ');\n                requestParameterMap.put('scope', scope);\n                gs.info('CustomOAuthUtil: Modified scope format for NetSuite');\n            }\n        } else if (flow == 'refresh_token') {\n            \u002F\u002F Handle refresh token flow modifications\n            gs.info('CustomOAuthUtil: Processing refresh token flow');\n            \n            \u002F\u002F Add any refresh-specific parameter modifications here\n        }\n\n        \u002F\u002F Log final parameters for debugging\n        gs.info('CustomOAuthUtil: Modified parameters: ' + JSON.stringify(requestParameterMap));\n    },\n\n    _hashCodeVerifier: function(codeVerifier) {\n        \u002F\u002F Apply SHA256 hash to the code_verifier\n        var crypto = new GlideCertificateEncryption();\n        var hashedBytes = crypto.generateMac(codeVerifier, 'SHA-256', '');\n        \n        \u002F\u002F Convert to base64url encoding (URL-safe base64)\n        var base64 = GlideStringUtil.base64Encode(hashedBytes);\n        \u002F\u002F Make it URL-safe by replacing characters\n        var base64url = base64.replace(\u002F\\+\u002Fg, '-').replace(\u002F\\\u002F\u002Fg, '_').replace(\u002F=\u002Fg, '');\n        \n        return base64url;\n    },\n\n    _generateCompliantCodeVerifier: function() {\n        \u002F\u002F Generate a code_verifier that meets NetSuite's requirements (43-128 chars)\n        var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n        var length = 64; \u002F\u002F A safe middle ground\n        var verifier = '';\n        \n        for (var i = 0; i \u003C length; i++) {\n            verifier += chars.charAt(Math.floor(Math.random() * chars.length));\n        }\n        \n        gs.info('CustomOAuthUtil: Generated compliant code_verifier with length: ' + verifier.length);\n        return verifier;\n    },\n\n    type: 'CustomOAuthUtil'\n});\n","javascript","",[93,94,95,121,146,161,186,192,199,229,236,257,274,299,304,310,331,336,342,359,373,379,384,393,398,403,423,429,444,450,456,462,482,505,523,543,549,554,560,576,596,610,616,622,656,678,684,702,708,713,719,739,753,767,772,777,783,799,805,824,838,843,849,871,886,904,909,914,919,925,941,961,967,996,1010,1024,1029,1050,1056,1071,1076,1082,1087,1092,1098,1120,1125,1130,1147,1153,1172,1201,1207,1213,1232,1238,1309,1314,1322,1327,1332,1344,1350,1366,1385,1400,1405,1437,1476,1481,1486,1507,1515,1520,1525,1534],"code",{"__ignoreMap":91},[96,97,100,104,108,111,114,118],"span",{"class":98,"line":99},"line",1,[96,101,103],{"class":102},"sCydW","var",[96,105,107],{"class":106},"sKWpL"," CustomOAuthUtil ",[96,109,110],{"class":102},"=",[96,112,113],{"class":106}," Class.",[96,115,117],{"class":116},"se37E","create",[96,119,120],{"class":106},"();\n",[96,122,124,128,131,134,137,140,143],{"class":98,"line":123},2,[96,125,127],{"class":126},"sMN4m","CustomOAuthUtil",[96,129,130],{"class":106},".",[96,132,133],{"class":126},"prototype",[96,135,136],{"class":102}," =",[96,138,139],{"class":106}," Object.",[96,141,142],{"class":116},"extendsObject",[96,144,145],{"class":106},"(OAuthUtil, {\n",[96,147,149,152,155,158],{"class":98,"line":148},3,[96,150,151],{"class":116},"    initialize",[96,153,154],{"class":106},": ",[96,156,157],{"class":102},"function",[96,159,160],{"class":106},"() {\n",[96,162,164,167,169,171,174,177,180,183],{"class":98,"line":163},4,[96,165,166],{"class":126},"        OAuthUtil",[96,168,130],{"class":106},[96,170,133],{"class":126},[96,172,173],{"class":106},".initialize.",[96,175,176],{"class":116},"call",[96,178,179],{"class":106},"(",[96,181,182],{"class":126},"this",[96,184,185],{"class":106},");\n",[96,187,189],{"class":98,"line":188},5,[96,190,191],{"class":106},"    },\n",[96,193,195],{"class":98,"line":194},6,[96,196,198],{"emptyLinePlaceholder":197},true,"\n",[96,200,202,205,207,209,211,215,218,221,223,226],{"class":98,"line":201},7,[96,203,204],{"class":116},"    interceptRequestParameters",[96,206,154],{"class":106},[96,208,157],{"class":102},[96,210,179],{"class":106},[96,212,214],{"class":213},"sj_tP","requestParameterMap",[96,216,217],{"class":106},", ",[96,219,220],{"class":213},"flow",[96,222,217],{"class":106},[96,224,225],{"class":213},"providerName",[96,227,228],{"class":106},") {\n",[96,230,232],{"class":98,"line":231},8,[96,233,235],{"class":234},"sJ8bj","        \u002F\u002F Log the incoming parameters for debugging\n",[96,237,239,242,245,247,251,254],{"class":98,"line":238},9,[96,240,241],{"class":106},"        gs.",[96,243,244],{"class":116},"info",[96,246,179],{"class":106},[96,248,250],{"class":249},"sOTlB","'CustomOAuthUtil: Intercepting parameters for provider: '",[96,252,253],{"class":102}," +",[96,255,256],{"class":106}," providerName);\n",[96,258,260,262,264,266,269,271],{"class":98,"line":259},10,[96,261,241],{"class":106},[96,263,244],{"class":116},[96,265,179],{"class":106},[96,267,268],{"class":249},"'CustomOAuthUtil: Flow type: '",[96,270,253],{"class":102},[96,272,273],{"class":106}," flow);\n",[96,275,277,279,281,283,286,288,291,293,296],{"class":98,"line":276},11,[96,278,241],{"class":106},[96,280,244],{"class":116},[96,282,179],{"class":106},[96,284,285],{"class":249},"'CustomOAuthUtil: Original parameters: '",[96,287,253],{"class":102},[96,289,290],{"class":126}," JSON",[96,292,130],{"class":106},[96,294,295],{"class":116},"stringify",[96,297,298],{"class":106},"(requestParameterMap));\n",[96,300,302],{"class":98,"line":301},12,[96,303,198],{"emptyLinePlaceholder":197},[96,305,307],{"class":98,"line":306},13,[96,308,309],{"class":234},"        \u002F\u002F Call the parent method first\n",[96,311,313,315,317,319,322,324,326,328],{"class":98,"line":312},14,[96,314,166],{"class":126},[96,316,130],{"class":106},[96,318,133],{"class":126},[96,320,321],{"class":106},".interceptRequestParameters.",[96,323,176],{"class":116},[96,325,179],{"class":106},[96,327,182],{"class":126},[96,329,330],{"class":106},", requestParameterMap, flow, providerName);\n",[96,332,334],{"class":98,"line":333},15,[96,335,198],{"emptyLinePlaceholder":197},[96,337,339],{"class":98,"line":338},16,[96,340,341],{"class":234},"        \u002F\u002F Customize parameters based on provider name\n",[96,343,345,348,351,354,357],{"class":98,"line":344},17,[96,346,347],{"class":102},"        if",[96,349,350],{"class":106}," (providerName ",[96,352,353],{"class":102},"==",[96,355,356],{"class":249}," 'NetSuite OAuth Provider'",[96,358,228],{"class":106},[96,360,362,365,367,370],{"class":98,"line":361},18,[96,363,364],{"class":126},"            this",[96,366,130],{"class":106},[96,368,369],{"class":116},"_customizeNetSuiteParameters",[96,371,372],{"class":106},"(requestParameterMap, flow);\n",[96,374,376],{"class":98,"line":375},19,[96,377,378],{"class":106},"        }\n",[96,380,382],{"class":98,"line":381},20,[96,383,198],{"emptyLinePlaceholder":197},[96,385,387,390],{"class":98,"line":386},21,[96,388,389],{"class":102},"        return",[96,391,392],{"class":106}," requestParameterMap;\n",[96,394,396],{"class":98,"line":395},22,[96,397,191],{"class":106},[96,399,401],{"class":98,"line":400},23,[96,402,198],{"emptyLinePlaceholder":197},[96,404,406,409,411,413,415,417,419,421],{"class":98,"line":405},24,[96,407,408],{"class":116},"    _customizeNetSuiteParameters",[96,410,154],{"class":106},[96,412,157],{"class":102},[96,414,179],{"class":106},[96,416,214],{"class":213},[96,418,217],{"class":106},[96,420,220],{"class":213},[96,422,228],{"class":106},[96,424,426],{"class":98,"line":425},25,[96,427,428],{"class":234},"        \u002F\u002F Handle different OAuth flows\n",[96,430,432,434,437,439,442],{"class":98,"line":431},26,[96,433,347],{"class":102},[96,435,436],{"class":106}," (flow ",[96,438,353],{"class":102},[96,440,441],{"class":249}," 'authorization_code'",[96,443,228],{"class":106},[96,445,447],{"class":98,"line":446},27,[96,448,449],{"class":234},"            \u002F\u002F NetSuite specific modifications for authorization code flow\n",[96,451,453],{"class":98,"line":452},28,[96,454,455],{"class":106},"            \n",[96,457,459],{"class":98,"line":458},29,[96,460,461],{"class":234},"            \u002F\u002F Modify grant_type format if needed\n",[96,463,465,468,471,474,476,479],{"class":98,"line":464},30,[96,466,467],{"class":102},"            if",[96,469,470],{"class":106}," (requestParameterMap.",[96,472,473],{"class":116},"containsKey",[96,475,179],{"class":106},[96,477,478],{"class":249},"'grant_type'",[96,480,481],{"class":106},")) {\n",[96,483,485,488,491,493,496,499,501,503],{"class":98,"line":484},31,[96,486,487],{"class":102},"                var",[96,489,490],{"class":106}," grantType ",[96,492,110],{"class":102},[96,494,495],{"class":106}," requestParameterMap.",[96,497,498],{"class":116},"get",[96,500,179],{"class":106},[96,502,478],{"class":249},[96,504,185],{"class":106},[96,506,508,511,513,515,518,520],{"class":98,"line":507},32,[96,509,510],{"class":106},"                gs.",[96,512,244],{"class":116},[96,514,179],{"class":106},[96,516,517],{"class":249},"'CustomOAuthUtil: Original grant_type: '",[96,519,253],{"class":102},[96,521,522],{"class":106}," grantType);\n",[96,524,526,529,532,534,536,538,541],{"class":98,"line":525},33,[96,527,528],{"class":106},"                requestParameterMap.",[96,530,531],{"class":116},"put",[96,533,179],{"class":106},[96,535,478],{"class":249},[96,537,217],{"class":106},[96,539,540],{"class":249},"'authorization_code'",[96,542,185],{"class":106},[96,544,546],{"class":98,"line":545},34,[96,547,548],{"class":106},"            }\n",[96,550,552],{"class":98,"line":551},35,[96,553,198],{"emptyLinePlaceholder":197},[96,555,557],{"class":98,"line":556},36,[96,558,559],{"class":234},"            \u002F\u002F NetSuite requires code_verifier to be SHA256 hashed with specific length\n",[96,561,563,565,567,569,571,574],{"class":98,"line":562},37,[96,564,467],{"class":102},[96,566,470],{"class":106},[96,568,473],{"class":116},[96,570,179],{"class":106},[96,572,573],{"class":249},"'code_verifier'",[96,575,481],{"class":106},[96,577,579,581,584,586,588,590,592,594],{"class":98,"line":578},38,[96,580,487],{"class":102},[96,582,583],{"class":106}," codeVerifier ",[96,585,110],{"class":102},[96,587,495],{"class":106},[96,589,498],{"class":116},[96,591,179],{"class":106},[96,593,573],{"class":249},[96,595,185],{"class":106},[96,597,599,601,603,605,608],{"class":98,"line":598},39,[96,600,510],{"class":106},[96,602,244],{"class":116},[96,604,179],{"class":106},[96,606,607],{"class":249},"'CustomOAuthUtil: Processing code_verifier for NetSuite'",[96,609,185],{"class":106},[96,611,613],{"class":98,"line":612},40,[96,614,615],{"class":106},"                \n",[96,617,619],{"class":98,"line":618},41,[96,620,621],{"class":234},"                \u002F\u002F Validate code_verifier length (43-128 characters)\n",[96,623,625,628,631,634,637,640,643,646,648,651,654],{"class":98,"line":624},42,[96,626,627],{"class":102},"                if",[96,629,630],{"class":106}," (codeVerifier.",[96,632,633],{"class":126},"length",[96,635,636],{"class":102}," \u003C",[96,638,639],{"class":126}," 43",[96,641,642],{"class":102}," ||",[96,644,645],{"class":106}," codeVerifier.",[96,647,633],{"class":126},[96,649,650],{"class":102}," >",[96,652,653],{"class":126}," 128",[96,655,228],{"class":106},[96,657,659,662,665,667,670,672,674,676],{"class":98,"line":658},43,[96,660,661],{"class":106},"                    gs.",[96,663,664],{"class":116},"error",[96,666,179],{"class":106},[96,668,669],{"class":249},"'CustomOAuthUtil: code_verifier length must be between 43 and 128 characters. Current length: '",[96,671,253],{"class":102},[96,673,645],{"class":106},[96,675,633],{"class":126},[96,677,185],{"class":106},[96,679,681],{"class":98,"line":680},44,[96,682,683],{"class":234},"                    \u002F\u002F Generate a new compliant code_verifier if needed\n",[96,685,687,690,692,695,697,700],{"class":98,"line":686},45,[96,688,689],{"class":106},"                    codeVerifier ",[96,691,110],{"class":102},[96,693,694],{"class":126}," this",[96,696,130],{"class":106},[96,698,699],{"class":116},"_generateCompliantCodeVerifier",[96,701,120],{"class":106},[96,703,705],{"class":98,"line":704},46,[96,706,707],{"class":106},"                }\n",[96,709,711],{"class":98,"line":710},47,[96,712,615],{"class":106},[96,714,716],{"class":98,"line":715},48,[96,717,718],{"class":234},"                \u002F\u002F Apply SHA256 hash to code_verifier\n",[96,720,722,724,727,729,731,733,736],{"class":98,"line":721},49,[96,723,487],{"class":102},[96,725,726],{"class":106}," hashedVerifier ",[96,728,110],{"class":102},[96,730,694],{"class":126},[96,732,130],{"class":106},[96,734,735],{"class":116},"_hashCodeVerifier",[96,737,738],{"class":106},"(codeVerifier);\n",[96,740,742,744,746,748,750],{"class":98,"line":741},50,[96,743,528],{"class":106},[96,745,531],{"class":116},[96,747,179],{"class":106},[96,749,573],{"class":249},[96,751,752],{"class":106},", hashedVerifier);\n",[96,754,756,758,760,762,765],{"class":98,"line":755},51,[96,757,510],{"class":106},[96,759,244],{"class":116},[96,761,179],{"class":106},[96,763,764],{"class":249},"'CustomOAuthUtil: Applied SHA256 hash to code_verifier'",[96,766,185],{"class":106},[96,768,770],{"class":98,"line":769},52,[96,771,548],{"class":106},[96,773,775],{"class":98,"line":774},53,[96,776,198],{"emptyLinePlaceholder":197},[96,778,780],{"class":98,"line":779},54,[96,781,782],{"class":234},"            \u002F\u002F NetSuite requires code_challenge_method to be SHA256 when code_challenge is present\n",[96,784,786,788,790,792,794,797],{"class":98,"line":785},55,[96,787,467],{"class":102},[96,789,470],{"class":106},[96,791,473],{"class":116},[96,793,179],{"class":106},[96,795,796],{"class":249},"'code_challenge'",[96,798,481],{"class":106},[96,800,802],{"class":98,"line":801},56,[96,803,804],{"class":234},"                \u002F\u002F Ensure code_challenge_method is set to S256\n",[96,806,808,810,812,814,817,819,822],{"class":98,"line":807},57,[96,809,528],{"class":106},[96,811,531],{"class":116},[96,813,179],{"class":106},[96,815,816],{"class":249},"'code_challenge_method'",[96,818,217],{"class":106},[96,820,821],{"class":249},"'S256'",[96,823,185],{"class":106},[96,825,827,829,831,833,836],{"class":98,"line":826},58,[96,828,510],{"class":106},[96,830,244],{"class":116},[96,832,179],{"class":106},[96,834,835],{"class":249},"'CustomOAuthUtil: Set code_challenge_method to S256 for NetSuite'",[96,837,185],{"class":106},[96,839,841],{"class":98,"line":840},59,[96,842,615],{"class":106},[96,844,846],{"class":98,"line":845},60,[96,847,848],{"class":234},"                \u002F\u002F If code_challenge exists but code_challenge_method doesn't, add it\n",[96,850,852,854,857,860,863,865,867,869],{"class":98,"line":851},61,[96,853,627],{"class":102},[96,855,856],{"class":106}," (",[96,858,859],{"class":102},"!",[96,861,862],{"class":106},"requestParameterMap.",[96,864,473],{"class":116},[96,866,179],{"class":106},[96,868,816],{"class":249},[96,870,481],{"class":106},[96,872,874,876,879,881,884],{"class":98,"line":873},62,[96,875,661],{"class":106},[96,877,878],{"class":116},"warn",[96,880,179],{"class":106},[96,882,883],{"class":249},"'CustomOAuthUtil: code_challenge present without code_challenge_method - adding S256'",[96,885,185],{"class":106},[96,887,889,892,894,896,898,900,902],{"class":98,"line":888},63,[96,890,891],{"class":106},"                    requestParameterMap.",[96,893,531],{"class":116},[96,895,179],{"class":106},[96,897,816],{"class":249},[96,899,217],{"class":106},[96,901,821],{"class":249},[96,903,185],{"class":106},[96,905,907],{"class":98,"line":906},64,[96,908,707],{"class":106},[96,910,912],{"class":98,"line":911},65,[96,913,548],{"class":106},[96,915,917],{"class":98,"line":916},66,[96,918,198],{"emptyLinePlaceholder":197},[96,920,922],{"class":98,"line":921},67,[96,923,924],{"class":234},"            \u002F\u002F Modify scope format\n",[96,926,928,930,932,934,936,939],{"class":98,"line":927},68,[96,929,467],{"class":102},[96,931,470],{"class":106},[96,933,473],{"class":116},[96,935,179],{"class":106},[96,937,938],{"class":249},"'scope'",[96,940,481],{"class":106},[96,942,944,946,949,951,953,955,957,959],{"class":98,"line":943},69,[96,945,487],{"class":102},[96,947,948],{"class":106}," scope ",[96,950,110],{"class":102},[96,952,495],{"class":106},[96,954,498],{"class":116},[96,956,179],{"class":106},[96,958,938],{"class":249},[96,960,185],{"class":106},[96,962,964],{"class":98,"line":963},70,[96,965,966],{"class":234},"                \u002F\u002F NetSuite expects space-separated scopes\n",[96,968,970,973,975,978,981,983,986,989,991,994],{"class":98,"line":969},71,[96,971,972],{"class":106},"                scope ",[96,974,110],{"class":102},[96,976,977],{"class":106}," scope.",[96,979,980],{"class":116},"replace",[96,982,179],{"class":106},[96,984,985],{"class":249},"\u002F,\u002F",[96,987,988],{"class":102},"g",[96,990,217],{"class":106},[96,992,993],{"class":249},"' '",[96,995,185],{"class":106},[96,997,999,1001,1003,1005,1007],{"class":98,"line":998},72,[96,1000,528],{"class":106},[96,1002,531],{"class":116},[96,1004,179],{"class":106},[96,1006,938],{"class":249},[96,1008,1009],{"class":106},", scope);\n",[96,1011,1013,1015,1017,1019,1022],{"class":98,"line":1012},73,[96,1014,510],{"class":106},[96,1016,244],{"class":116},[96,1018,179],{"class":106},[96,1020,1021],{"class":249},"'CustomOAuthUtil: Modified scope format for NetSuite'",[96,1023,185],{"class":106},[96,1025,1027],{"class":98,"line":1026},74,[96,1028,548],{"class":106},[96,1030,1032,1035,1038,1041,1043,1045,1048],{"class":98,"line":1031},75,[96,1033,1034],{"class":106},"        } ",[96,1036,1037],{"class":102},"else",[96,1039,1040],{"class":102}," if",[96,1042,436],{"class":106},[96,1044,353],{"class":102},[96,1046,1047],{"class":249}," 'refresh_token'",[96,1049,228],{"class":106},[96,1051,1053],{"class":98,"line":1052},76,[96,1054,1055],{"class":234},"            \u002F\u002F Handle refresh token flow modifications\n",[96,1057,1059,1062,1064,1066,1069],{"class":98,"line":1058},77,[96,1060,1061],{"class":106},"            gs.",[96,1063,244],{"class":116},[96,1065,179],{"class":106},[96,1067,1068],{"class":249},"'CustomOAuthUtil: Processing refresh token flow'",[96,1070,185],{"class":106},[96,1072,1074],{"class":98,"line":1073},78,[96,1075,455],{"class":106},[96,1077,1079],{"class":98,"line":1078},79,[96,1080,1081],{"class":234},"            \u002F\u002F Add any refresh-specific parameter modifications here\n",[96,1083,1085],{"class":98,"line":1084},80,[96,1086,378],{"class":106},[96,1088,1090],{"class":98,"line":1089},81,[96,1091,198],{"emptyLinePlaceholder":197},[96,1093,1095],{"class":98,"line":1094},82,[96,1096,1097],{"class":234},"        \u002F\u002F Log final parameters for debugging\n",[96,1099,1101,1103,1105,1107,1110,1112,1114,1116,1118],{"class":98,"line":1100},83,[96,1102,241],{"class":106},[96,1104,244],{"class":116},[96,1106,179],{"class":106},[96,1108,1109],{"class":249},"'CustomOAuthUtil: Modified parameters: '",[96,1111,253],{"class":102},[96,1113,290],{"class":126},[96,1115,130],{"class":106},[96,1117,295],{"class":116},[96,1119,298],{"class":106},[96,1121,1123],{"class":98,"line":1122},84,[96,1124,191],{"class":106},[96,1126,1128],{"class":98,"line":1127},85,[96,1129,198],{"emptyLinePlaceholder":197},[96,1131,1133,1136,1138,1140,1142,1145],{"class":98,"line":1132},86,[96,1134,1135],{"class":116},"    _hashCodeVerifier",[96,1137,154],{"class":106},[96,1139,157],{"class":102},[96,1141,179],{"class":106},[96,1143,1144],{"class":213},"codeVerifier",[96,1146,228],{"class":106},[96,1148,1150],{"class":98,"line":1149},87,[96,1151,1152],{"class":234},"        \u002F\u002F Apply SHA256 hash to the code_verifier\n",[96,1154,1156,1159,1162,1164,1167,1170],{"class":98,"line":1155},88,[96,1157,1158],{"class":102},"        var",[96,1160,1161],{"class":106}," crypto ",[96,1163,110],{"class":102},[96,1165,1166],{"class":102}," new",[96,1168,1169],{"class":116}," GlideCertificateEncryption",[96,1171,120],{"class":106},[96,1173,1175,1177,1180,1182,1185,1188,1191,1194,1196,1199],{"class":98,"line":1174},89,[96,1176,1158],{"class":102},[96,1178,1179],{"class":106}," hashedBytes ",[96,1181,110],{"class":102},[96,1183,1184],{"class":106}," crypto.",[96,1186,1187],{"class":116},"generateMac",[96,1189,1190],{"class":106},"(codeVerifier, ",[96,1192,1193],{"class":249},"'SHA-256'",[96,1195,217],{"class":106},[96,1197,1198],{"class":249},"''",[96,1200,185],{"class":106},[96,1202,1204],{"class":98,"line":1203},90,[96,1205,1206],{"class":106},"        \n",[96,1208,1210],{"class":98,"line":1209},91,[96,1211,1212],{"class":234},"        \u002F\u002F Convert to base64url encoding (URL-safe base64)\n",[96,1214,1216,1218,1221,1223,1226,1229],{"class":98,"line":1215},92,[96,1217,1158],{"class":102},[96,1219,1220],{"class":106}," base64 ",[96,1222,110],{"class":102},[96,1224,1225],{"class":106}," GlideStringUtil.",[96,1227,1228],{"class":116},"base64Encode",[96,1230,1231],{"class":106},"(hashedBytes);\n",[96,1233,1235],{"class":98,"line":1234},93,[96,1236,1237],{"class":234},"        \u002F\u002F Make it URL-safe by replacing characters\n",[96,1239,1241,1243,1246,1248,1251,1253,1255,1258,1262,1264,1266,1268,1271,1274,1276,1278,1280,1283,1285,1287,1289,1292,1294,1296,1298,1301,1303,1305,1307],{"class":98,"line":1240},94,[96,1242,1158],{"class":102},[96,1244,1245],{"class":106}," base64url ",[96,1247,110],{"class":102},[96,1249,1250],{"class":106}," base64.",[96,1252,980],{"class":116},[96,1254,179],{"class":106},[96,1256,1257],{"class":249},"\u002F",[96,1259,1261],{"class":1260},"sc-UE","\\+",[96,1263,1257],{"class":249},[96,1265,988],{"class":102},[96,1267,217],{"class":106},[96,1269,1270],{"class":249},"'-'",[96,1272,1273],{"class":106},").",[96,1275,980],{"class":116},[96,1277,179],{"class":106},[96,1279,1257],{"class":249},[96,1281,1282],{"class":1260},"\\\u002F",[96,1284,1257],{"class":249},[96,1286,988],{"class":102},[96,1288,217],{"class":106},[96,1290,1291],{"class":249},"'_'",[96,1293,1273],{"class":106},[96,1295,980],{"class":116},[96,1297,179],{"class":106},[96,1299,1300],{"class":249},"\u002F=\u002F",[96,1302,988],{"class":102},[96,1304,217],{"class":106},[96,1306,1198],{"class":249},[96,1308,185],{"class":106},[96,1310,1312],{"class":98,"line":1311},95,[96,1313,1206],{"class":106},[96,1315,1317,1319],{"class":98,"line":1316},96,[96,1318,389],{"class":102},[96,1320,1321],{"class":106}," base64url;\n",[96,1323,1325],{"class":98,"line":1324},97,[96,1326,191],{"class":106},[96,1328,1330],{"class":98,"line":1329},98,[96,1331,198],{"emptyLinePlaceholder":197},[96,1333,1335,1338,1340,1342],{"class":98,"line":1334},99,[96,1336,1337],{"class":116},"    _generateCompliantCodeVerifier",[96,1339,154],{"class":106},[96,1341,157],{"class":102},[96,1343,160],{"class":106},[96,1345,1347],{"class":98,"line":1346},100,[96,1348,1349],{"class":234},"        \u002F\u002F Generate a code_verifier that meets NetSuite's requirements (43-128 chars)\n",[96,1351,1353,1355,1358,1360,1363],{"class":98,"line":1352},101,[96,1354,1158],{"class":102},[96,1356,1357],{"class":106}," chars ",[96,1359,110],{"class":102},[96,1361,1362],{"class":249}," 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'",[96,1364,1365],{"class":106},";\n",[96,1367,1369,1371,1374,1376,1379,1382],{"class":98,"line":1368},102,[96,1370,1158],{"class":102},[96,1372,1373],{"class":106}," length ",[96,1375,110],{"class":102},[96,1377,1378],{"class":126}," 64",[96,1380,1381],{"class":106},"; ",[96,1383,1384],{"class":234},"\u002F\u002F A safe middle ground\n",[96,1386,1388,1390,1393,1395,1398],{"class":98,"line":1387},103,[96,1389,1158],{"class":102},[96,1391,1392],{"class":106}," verifier ",[96,1394,110],{"class":102},[96,1396,1397],{"class":249}," ''",[96,1399,1365],{"class":106},[96,1401,1403],{"class":98,"line":1402},104,[96,1404,1206],{"class":106},[96,1406,1408,1411,1413,1415,1418,1420,1423,1426,1429,1432,1435],{"class":98,"line":1407},105,[96,1409,1410],{"class":102},"        for",[96,1412,856],{"class":106},[96,1414,103],{"class":102},[96,1416,1417],{"class":106}," i ",[96,1419,110],{"class":102},[96,1421,1422],{"class":126}," 0",[96,1424,1425],{"class":106},"; i ",[96,1427,1428],{"class":102},"\u003C",[96,1430,1431],{"class":106}," length; i",[96,1433,1434],{"class":102},"++",[96,1436,228],{"class":106},[96,1438,1440,1443,1446,1449,1452,1455,1458,1460,1463,1466,1469,1471,1473],{"class":98,"line":1439},106,[96,1441,1442],{"class":106},"            verifier ",[96,1444,1445],{"class":102},"+=",[96,1447,1448],{"class":106}," chars.",[96,1450,1451],{"class":116},"charAt",[96,1453,1454],{"class":106},"(Math.",[96,1456,1457],{"class":116},"floor",[96,1459,1454],{"class":106},[96,1461,1462],{"class":116},"random",[96,1464,1465],{"class":106},"() ",[96,1467,1468],{"class":102},"*",[96,1470,1448],{"class":106},[96,1472,633],{"class":126},[96,1474,1475],{"class":106},"));\n",[96,1477,1479],{"class":98,"line":1478},107,[96,1480,378],{"class":106},[96,1482,1484],{"class":98,"line":1483},108,[96,1485,1206],{"class":106},[96,1487,1489,1491,1493,1495,1498,1500,1503,1505],{"class":98,"line":1488},109,[96,1490,241],{"class":106},[96,1492,244],{"class":116},[96,1494,179],{"class":106},[96,1496,1497],{"class":249},"'CustomOAuthUtil: Generated compliant code_verifier with length: '",[96,1499,253],{"class":102},[96,1501,1502],{"class":106}," verifier.",[96,1504,633],{"class":126},[96,1506,185],{"class":106},[96,1508,1510,1512],{"class":98,"line":1509},110,[96,1511,389],{"class":102},[96,1513,1514],{"class":106}," verifier;\n",[96,1516,1518],{"class":98,"line":1517},111,[96,1519,191],{"class":106},[96,1521,1523],{"class":98,"line":1522},112,[96,1524,198],{"emptyLinePlaceholder":197},[96,1526,1528,1531],{"class":98,"line":1527},113,[96,1529,1530],{"class":106},"    type: ",[96,1532,1533],{"class":249},"'CustomOAuthUtil'\n",[96,1535,1537],{"class":98,"line":1536},114,[96,1538,1539],{"class":106},"});\n",[78,1541,1543],{"id":1542},"step-2-configure-your-oauth-provider","Step 2: Configure Your OAuth Provider",[12,1545,1546],{},"After creating the custom script include, you need to configure your OAuth provider to use it:",[1548,1549,1550,1556,1559],"ol",{},[30,1551,1552,1553],{},"Navigate to ",[33,1554,1555],{},"System OAuth > Application Registry",[30,1557,1558],{},"Open your NetSuite OAuth provider record",[30,1560,1561,1562],{},"In the OAuth Entity Profile or OAuth Entity Scope, update the Script Include field to reference your custom script: ",[93,1563,127],{},[78,1565,1567],{"id":1566},"step-3-advanced-parameter-modifications","Step 3: Advanced Parameter Modifications",[12,1569,1570],{},"For more complex scenarios, you can implement sophisticated parameter handling:",[86,1572,1574],{"className":88,"code":1573,"language":90,"meta":91,"style":91},"_customizeNetSuiteParameters: function(requestParameterMap, flow) {\n    \u002F\u002F Dynamic parameter modification based on instance settings\n    var netsuiteConfig = this._getNetSuiteConfiguration();\n    \n    if (flow == 'authorization_code') {\n        \u002F\u002F Handle dynamic client assertions if needed\n        if (netsuiteConfig.requiresClientAssertion) {\n            var assertion = this._generateClientAssertion(netsuiteConfig);\n            requestParameterMap.put('client_assertion', assertion);\n            requestParameterMap.put('client_assertion_type', \n                'urn:ietf:params:oauth:client-assertion-type:jwt-bearer');\n            \n            \u002F\u002F Remove client_secret if using assertion\n            if (requestParameterMap.containsKey('client_secret')) {\n                requestParameterMap.remove('client_secret');\n            }\n        }\n        \n        \u002F\u002F Handle custom redirect URI encoding\n        if (requestParameterMap.containsKey('redirect_uri')) {\n            var redirectUri = requestParameterMap.get('redirect_uri');\n            \u002F\u002F NetSuite might require specific encoding\n            var encodedUri = this._customEncodeUri(redirectUri);\n            requestParameterMap.put('redirect_uri', encodedUri);\n        }\n        \n        \u002F\u002F Add NetSuite-specific headers as parameters if needed\n        if (netsuiteConfig.customHeaders) {\n            for (var header in netsuiteConfig.customHeaders) {\n                requestParameterMap.put(header, netsuiteConfig.customHeaders[header]);\n            }\n        }\n    }\n},\n\n_getNetSuiteConfiguration: function() {\n    \u002F\u002F Retrieve configuration from system properties or custom table\n    return {\n        requiresClientAssertion: gs.getProperty('netsuite.oauth.use_assertion', 'false') == 'true',\n        customHeaders: {\n            'X-NetSuite-Application-Id': gs.getProperty('netsuite.application.id', '')\n        }\n    };\n},\n\n_generateClientAssertion: function(config) {\n    \u002F\u002F Implement JWT generation for client assertion\n    \u002F\u002F This is a simplified example - implement proper JWT signing\n    var header = {\n        \"alg\": \"RS256\",\n        \"typ\": \"JWT\"\n    };\n    \n    var claims = {\n        \"iss\": gs.getProperty('oauth.client.id'),\n        \"sub\": gs.getProperty('oauth.client.id'),\n        \"aud\": gs.getProperty('netsuite.token.endpoint'),\n        \"exp\": Math.floor(Date.now() \u002F 1000) + 300,\n        \"iat\": Math.floor(Date.now() \u002F 1000)\n    };\n    \n    \u002F\u002F In production, implement proper JWT signing\n    return \"generated.jwt.token\";\n},\n\n_customEncodeUri: function(uri) {\n    \u002F\u002F Implement custom URI encoding if NetSuite requires it\n    \u002F\u002F Some systems have specific encoding requirements\n    return encodeURI(uri).replace(\u002F%20\u002Fg, '+');\n}\n",[93,1575,1576,1594,1599,1618,1623,1636,1641,1648,1668,1683,1697,1704,1708,1713,1728,1741,1745,1749,1753,1758,1773,1792,1797,1816,1829,1833,1837,1842,1849,1867,1876,1880,1884,1889,1894,1898,1908,1913,1921,1950,1955,1977,1981,1986,1990,1994,2009,2014,2019,2029,2041,2051,2055,2059,2070,2087,2102,2118,2151,2172,2176,2180,2185,2194,2198,2202,2217,2222,2227,2253],{"__ignoreMap":91},[96,1577,1578,1580,1582,1584,1586,1588,1590,1592],{"class":98,"line":99},[96,1579,369],{"class":116},[96,1581,154],{"class":106},[96,1583,157],{"class":102},[96,1585,179],{"class":106},[96,1587,214],{"class":213},[96,1589,217],{"class":106},[96,1591,220],{"class":213},[96,1593,228],{"class":106},[96,1595,1596],{"class":98,"line":123},[96,1597,1598],{"class":234},"    \u002F\u002F Dynamic parameter modification based on instance settings\n",[96,1600,1601,1604,1607,1609,1611,1613,1616],{"class":98,"line":148},[96,1602,1603],{"class":102},"    var",[96,1605,1606],{"class":106}," netsuiteConfig ",[96,1608,110],{"class":102},[96,1610,694],{"class":126},[96,1612,130],{"class":106},[96,1614,1615],{"class":116},"_getNetSuiteConfiguration",[96,1617,120],{"class":106},[96,1619,1620],{"class":98,"line":163},[96,1621,1622],{"class":106},"    \n",[96,1624,1625,1628,1630,1632,1634],{"class":98,"line":188},[96,1626,1627],{"class":102},"    if",[96,1629,436],{"class":106},[96,1631,353],{"class":102},[96,1633,441],{"class":249},[96,1635,228],{"class":106},[96,1637,1638],{"class":98,"line":194},[96,1639,1640],{"class":234},"        \u002F\u002F Handle dynamic client assertions if needed\n",[96,1642,1643,1645],{"class":98,"line":201},[96,1644,347],{"class":102},[96,1646,1647],{"class":106}," (netsuiteConfig.requiresClientAssertion) {\n",[96,1649,1650,1653,1656,1658,1660,1662,1665],{"class":98,"line":231},[96,1651,1652],{"class":102},"            var",[96,1654,1655],{"class":106}," assertion ",[96,1657,110],{"class":102},[96,1659,694],{"class":126},[96,1661,130],{"class":106},[96,1663,1664],{"class":116},"_generateClientAssertion",[96,1666,1667],{"class":106},"(netsuiteConfig);\n",[96,1669,1670,1673,1675,1677,1680],{"class":98,"line":238},[96,1671,1672],{"class":106},"            requestParameterMap.",[96,1674,531],{"class":116},[96,1676,179],{"class":106},[96,1678,1679],{"class":249},"'client_assertion'",[96,1681,1682],{"class":106},", assertion);\n",[96,1684,1685,1687,1689,1691,1694],{"class":98,"line":259},[96,1686,1672],{"class":106},[96,1688,531],{"class":116},[96,1690,179],{"class":106},[96,1692,1693],{"class":249},"'client_assertion_type'",[96,1695,1696],{"class":106},", \n",[96,1698,1699,1702],{"class":98,"line":276},[96,1700,1701],{"class":249},"                'urn:ietf:params:oauth:client-assertion-type:jwt-bearer'",[96,1703,185],{"class":106},[96,1705,1706],{"class":98,"line":301},[96,1707,455],{"class":106},[96,1709,1710],{"class":98,"line":306},[96,1711,1712],{"class":234},"            \u002F\u002F Remove client_secret if using assertion\n",[96,1714,1715,1717,1719,1721,1723,1726],{"class":98,"line":312},[96,1716,467],{"class":102},[96,1718,470],{"class":106},[96,1720,473],{"class":116},[96,1722,179],{"class":106},[96,1724,1725],{"class":249},"'client_secret'",[96,1727,481],{"class":106},[96,1729,1730,1732,1735,1737,1739],{"class":98,"line":333},[96,1731,528],{"class":106},[96,1733,1734],{"class":116},"remove",[96,1736,179],{"class":106},[96,1738,1725],{"class":249},[96,1740,185],{"class":106},[96,1742,1743],{"class":98,"line":338},[96,1744,548],{"class":106},[96,1746,1747],{"class":98,"line":344},[96,1748,378],{"class":106},[96,1750,1751],{"class":98,"line":361},[96,1752,1206],{"class":106},[96,1754,1755],{"class":98,"line":375},[96,1756,1757],{"class":234},"        \u002F\u002F Handle custom redirect URI encoding\n",[96,1759,1760,1762,1764,1766,1768,1771],{"class":98,"line":381},[96,1761,347],{"class":102},[96,1763,470],{"class":106},[96,1765,473],{"class":116},[96,1767,179],{"class":106},[96,1769,1770],{"class":249},"'redirect_uri'",[96,1772,481],{"class":106},[96,1774,1775,1777,1780,1782,1784,1786,1788,1790],{"class":98,"line":386},[96,1776,1652],{"class":102},[96,1778,1779],{"class":106}," redirectUri ",[96,1781,110],{"class":102},[96,1783,495],{"class":106},[96,1785,498],{"class":116},[96,1787,179],{"class":106},[96,1789,1770],{"class":249},[96,1791,185],{"class":106},[96,1793,1794],{"class":98,"line":395},[96,1795,1796],{"class":234},"            \u002F\u002F NetSuite might require specific encoding\n",[96,1798,1799,1801,1804,1806,1808,1810,1813],{"class":98,"line":400},[96,1800,1652],{"class":102},[96,1802,1803],{"class":106}," encodedUri ",[96,1805,110],{"class":102},[96,1807,694],{"class":126},[96,1809,130],{"class":106},[96,1811,1812],{"class":116},"_customEncodeUri",[96,1814,1815],{"class":106},"(redirectUri);\n",[96,1817,1818,1820,1822,1824,1826],{"class":98,"line":405},[96,1819,1672],{"class":106},[96,1821,531],{"class":116},[96,1823,179],{"class":106},[96,1825,1770],{"class":249},[96,1827,1828],{"class":106},", encodedUri);\n",[96,1830,1831],{"class":98,"line":425},[96,1832,378],{"class":106},[96,1834,1835],{"class":98,"line":431},[96,1836,1206],{"class":106},[96,1838,1839],{"class":98,"line":446},[96,1840,1841],{"class":234},"        \u002F\u002F Add NetSuite-specific headers as parameters if needed\n",[96,1843,1844,1846],{"class":98,"line":452},[96,1845,347],{"class":102},[96,1847,1848],{"class":106}," (netsuiteConfig.customHeaders) {\n",[96,1850,1851,1854,1856,1858,1861,1864],{"class":98,"line":458},[96,1852,1853],{"class":102},"            for",[96,1855,856],{"class":106},[96,1857,103],{"class":102},[96,1859,1860],{"class":106}," header ",[96,1862,1863],{"class":102},"in",[96,1865,1866],{"class":106}," netsuiteConfig.customHeaders) {\n",[96,1868,1869,1871,1873],{"class":98,"line":464},[96,1870,528],{"class":106},[96,1872,531],{"class":116},[96,1874,1875],{"class":106},"(header, netsuiteConfig.customHeaders[header]);\n",[96,1877,1878],{"class":98,"line":484},[96,1879,548],{"class":106},[96,1881,1882],{"class":98,"line":507},[96,1883,378],{"class":106},[96,1885,1886],{"class":98,"line":525},[96,1887,1888],{"class":106},"    }\n",[96,1890,1891],{"class":98,"line":545},[96,1892,1893],{"class":106},"},\n",[96,1895,1896],{"class":98,"line":551},[96,1897,198],{"emptyLinePlaceholder":197},[96,1899,1900,1902,1904,1906],{"class":98,"line":556},[96,1901,1615],{"class":116},[96,1903,154],{"class":106},[96,1905,157],{"class":102},[96,1907,160],{"class":106},[96,1909,1910],{"class":98,"line":562},[96,1911,1912],{"class":234},"    \u002F\u002F Retrieve configuration from system properties or custom table\n",[96,1914,1915,1918],{"class":98,"line":578},[96,1916,1917],{"class":102},"    return",[96,1919,1920],{"class":106}," {\n",[96,1922,1923,1926,1929,1931,1934,1936,1939,1942,1944,1947],{"class":98,"line":598},[96,1924,1925],{"class":106},"        requiresClientAssertion: gs.",[96,1927,1928],{"class":116},"getProperty",[96,1930,179],{"class":106},[96,1932,1933],{"class":249},"'netsuite.oauth.use_assertion'",[96,1935,217],{"class":106},[96,1937,1938],{"class":249},"'false'",[96,1940,1941],{"class":106},") ",[96,1943,353],{"class":102},[96,1945,1946],{"class":249}," 'true'",[96,1948,1949],{"class":106},",\n",[96,1951,1952],{"class":98,"line":612},[96,1953,1954],{"class":106},"        customHeaders: {\n",[96,1956,1957,1960,1963,1965,1967,1970,1972,1974],{"class":98,"line":618},[96,1958,1959],{"class":249},"            'X-NetSuite-Application-Id'",[96,1961,1962],{"class":106},": gs.",[96,1964,1928],{"class":116},[96,1966,179],{"class":106},[96,1968,1969],{"class":249},"'netsuite.application.id'",[96,1971,217],{"class":106},[96,1973,1198],{"class":249},[96,1975,1976],{"class":106},")\n",[96,1978,1979],{"class":98,"line":624},[96,1980,378],{"class":106},[96,1982,1983],{"class":98,"line":658},[96,1984,1985],{"class":106},"    };\n",[96,1987,1988],{"class":98,"line":680},[96,1989,1893],{"class":106},[96,1991,1992],{"class":98,"line":686},[96,1993,198],{"emptyLinePlaceholder":197},[96,1995,1996,1998,2000,2002,2004,2007],{"class":98,"line":704},[96,1997,1664],{"class":116},[96,1999,154],{"class":106},[96,2001,157],{"class":102},[96,2003,179],{"class":106},[96,2005,2006],{"class":213},"config",[96,2008,228],{"class":106},[96,2010,2011],{"class":98,"line":710},[96,2012,2013],{"class":234},"    \u002F\u002F Implement JWT generation for client assertion\n",[96,2015,2016],{"class":98,"line":715},[96,2017,2018],{"class":234},"    \u002F\u002F This is a simplified example - implement proper JWT signing\n",[96,2020,2021,2023,2025,2027],{"class":98,"line":721},[96,2022,1603],{"class":102},[96,2024,1860],{"class":106},[96,2026,110],{"class":102},[96,2028,1920],{"class":106},[96,2030,2031,2034,2036,2039],{"class":98,"line":741},[96,2032,2033],{"class":249},"        \"alg\"",[96,2035,154],{"class":106},[96,2037,2038],{"class":249},"\"RS256\"",[96,2040,1949],{"class":106},[96,2042,2043,2046,2048],{"class":98,"line":755},[96,2044,2045],{"class":249},"        \"typ\"",[96,2047,154],{"class":106},[96,2049,2050],{"class":249},"\"JWT\"\n",[96,2052,2053],{"class":98,"line":769},[96,2054,1985],{"class":106},[96,2056,2057],{"class":98,"line":774},[96,2058,1622],{"class":106},[96,2060,2061,2063,2066,2068],{"class":98,"line":779},[96,2062,1603],{"class":102},[96,2064,2065],{"class":106}," claims ",[96,2067,110],{"class":102},[96,2069,1920],{"class":106},[96,2071,2072,2075,2077,2079,2081,2084],{"class":98,"line":785},[96,2073,2074],{"class":249},"        \"iss\"",[96,2076,1962],{"class":106},[96,2078,1928],{"class":116},[96,2080,179],{"class":106},[96,2082,2083],{"class":249},"'oauth.client.id'",[96,2085,2086],{"class":106},"),\n",[96,2088,2089,2092,2094,2096,2098,2100],{"class":98,"line":801},[96,2090,2091],{"class":249},"        \"sub\"",[96,2093,1962],{"class":106},[96,2095,1928],{"class":116},[96,2097,179],{"class":106},[96,2099,2083],{"class":249},[96,2101,2086],{"class":106},[96,2103,2104,2107,2109,2111,2113,2116],{"class":98,"line":807},[96,2105,2106],{"class":249},"        \"aud\"",[96,2108,1962],{"class":106},[96,2110,1928],{"class":116},[96,2112,179],{"class":106},[96,2114,2115],{"class":249},"'netsuite.token.endpoint'",[96,2117,2086],{"class":106},[96,2119,2120,2123,2126,2128,2131,2134,2136,2138,2141,2143,2146,2149],{"class":98,"line":826},[96,2121,2122],{"class":249},"        \"exp\"",[96,2124,2125],{"class":106},": Math.",[96,2127,1457],{"class":116},[96,2129,2130],{"class":106},"(Date.",[96,2132,2133],{"class":116},"now",[96,2135,1465],{"class":106},[96,2137,1257],{"class":102},[96,2139,2140],{"class":126}," 1000",[96,2142,1941],{"class":106},[96,2144,2145],{"class":102},"+",[96,2147,2148],{"class":126}," 300",[96,2150,1949],{"class":106},[96,2152,2153,2156,2158,2160,2162,2164,2166,2168,2170],{"class":98,"line":840},[96,2154,2155],{"class":249},"        \"iat\"",[96,2157,2125],{"class":106},[96,2159,1457],{"class":116},[96,2161,2130],{"class":106},[96,2163,2133],{"class":116},[96,2165,1465],{"class":106},[96,2167,1257],{"class":102},[96,2169,2140],{"class":126},[96,2171,1976],{"class":106},[96,2173,2174],{"class":98,"line":845},[96,2175,1985],{"class":106},[96,2177,2178],{"class":98,"line":851},[96,2179,1622],{"class":106},[96,2181,2182],{"class":98,"line":873},[96,2183,2184],{"class":234},"    \u002F\u002F In production, implement proper JWT signing\n",[96,2186,2187,2189,2192],{"class":98,"line":888},[96,2188,1917],{"class":102},[96,2190,2191],{"class":249}," \"generated.jwt.token\"",[96,2193,1365],{"class":106},[96,2195,2196],{"class":98,"line":906},[96,2197,1893],{"class":106},[96,2199,2200],{"class":98,"line":911},[96,2201,198],{"emptyLinePlaceholder":197},[96,2203,2204,2206,2208,2210,2212,2215],{"class":98,"line":916},[96,2205,1812],{"class":116},[96,2207,154],{"class":106},[96,2209,157],{"class":102},[96,2211,179],{"class":106},[96,2213,2214],{"class":213},"uri",[96,2216,228],{"class":106},[96,2218,2219],{"class":98,"line":921},[96,2220,2221],{"class":234},"    \u002F\u002F Implement custom URI encoding if NetSuite requires it\n",[96,2223,2224],{"class":98,"line":927},[96,2225,2226],{"class":234},"    \u002F\u002F Some systems have specific encoding requirements\n",[96,2228,2229,2231,2234,2237,2239,2241,2244,2246,2248,2251],{"class":98,"line":943},[96,2230,1917],{"class":102},[96,2232,2233],{"class":116}," encodeURI",[96,2235,2236],{"class":106},"(uri).",[96,2238,980],{"class":116},[96,2240,179],{"class":106},[96,2242,2243],{"class":249},"\u002F%20\u002F",[96,2245,988],{"class":102},[96,2247,217],{"class":106},[96,2249,2250],{"class":249},"'+'",[96,2252,185],{"class":106},[96,2254,2255],{"class":98,"line":963},[96,2256,2257],{"class":106},"}\n",[78,2259,2261],{"id":2260},"step-4-debugging-and-troubleshooting","Step 4: Debugging and Troubleshooting",[12,2263,2264],{},"To effectively debug OAuth2 parameter issues:",[1548,2266,2267],{},[30,2268,2269,2272],{},[33,2270,2271],{},"Enable OAuth Debug Logging",":",[86,2274,2276],{"className":88,"code":2275,"language":90,"meta":91,"style":91},"\u002F\u002F Add comprehensive logging in your custom script\ninterceptRequestParameters: function(requestParameterMap, flow, providerName) {\n    var debugEnabled = gs.getProperty('oauth.debug.enabled', 'false') == 'true';\n    \n    if (debugEnabled) {\n        gs.info('=== OAuth Parameter Modification Debug ===');\n        gs.info('Provider: ' + providerName);\n        gs.info('Flow: ' + flow);\n        gs.info('Parameters Before: ' + this._mapToString(requestParameterMap));\n    }\n    \n    \u002F\u002F Perform modifications\n    this._customizeNetSuiteParameters(requestParameterMap, flow);\n    \n    if (debugEnabled) {\n        gs.info('Parameters After: ' + this._mapToString(requestParameterMap));\n        gs.info('=== End OAuth Debug ===');\n    }\n    \n    return requestParameterMap;\n},\n\n_mapToString: function(map) {\n    var result = {};\n    var keys = map.keySet().toArray();\n    for (var i = 0; i \u003C keys.length; i++) {\n        var key = keys[i];\n        var value = map.get(key);\n        \u002F\u002F Mask sensitive values\n        if (key.toLowerCase().indexOf('secret') > -1 || \n            key.toLowerCase().indexOf('password') > -1) {\n            result[key] = '***MASKED***';\n        } else {\n            result[key] = value;\n        }\n    }\n    return JSON.stringify(result);\n}\n",[93,2277,2278,2283,2306,2337,2341,2348,2361,2376,2391,2413,2417,2421,2426,2437,2441,2447,2468,2481,2485,2489,2495,2499,2503,2518,2530,2553,2584,2596,2612,2617,2653,2679,2691,2699,2708,2712,2716,2729],{"__ignoreMap":91},[96,2279,2280],{"class":98,"line":99},[96,2281,2282],{"class":234},"\u002F\u002F Add comprehensive logging in your custom script\n",[96,2284,2285,2288,2290,2292,2294,2296,2298,2300,2302,2304],{"class":98,"line":123},[96,2286,2287],{"class":116},"interceptRequestParameters",[96,2289,154],{"class":106},[96,2291,157],{"class":102},[96,2293,179],{"class":106},[96,2295,214],{"class":213},[96,2297,217],{"class":106},[96,2299,220],{"class":213},[96,2301,217],{"class":106},[96,2303,225],{"class":213},[96,2305,228],{"class":106},[96,2307,2308,2310,2313,2315,2318,2320,2322,2325,2327,2329,2331,2333,2335],{"class":98,"line":148},[96,2309,1603],{"class":102},[96,2311,2312],{"class":106}," debugEnabled ",[96,2314,110],{"class":102},[96,2316,2317],{"class":106}," gs.",[96,2319,1928],{"class":116},[96,2321,179],{"class":106},[96,2323,2324],{"class":249},"'oauth.debug.enabled'",[96,2326,217],{"class":106},[96,2328,1938],{"class":249},[96,2330,1941],{"class":106},[96,2332,353],{"class":102},[96,2334,1946],{"class":249},[96,2336,1365],{"class":106},[96,2338,2339],{"class":98,"line":163},[96,2340,1622],{"class":106},[96,2342,2343,2345],{"class":98,"line":188},[96,2344,1627],{"class":102},[96,2346,2347],{"class":106}," (debugEnabled) {\n",[96,2349,2350,2352,2354,2356,2359],{"class":98,"line":194},[96,2351,241],{"class":106},[96,2353,244],{"class":116},[96,2355,179],{"class":106},[96,2357,2358],{"class":249},"'=== OAuth Parameter Modification Debug ==='",[96,2360,185],{"class":106},[96,2362,2363,2365,2367,2369,2372,2374],{"class":98,"line":201},[96,2364,241],{"class":106},[96,2366,244],{"class":116},[96,2368,179],{"class":106},[96,2370,2371],{"class":249},"'Provider: '",[96,2373,253],{"class":102},[96,2375,256],{"class":106},[96,2377,2378,2380,2382,2384,2387,2389],{"class":98,"line":231},[96,2379,241],{"class":106},[96,2381,244],{"class":116},[96,2383,179],{"class":106},[96,2385,2386],{"class":249},"'Flow: '",[96,2388,253],{"class":102},[96,2390,273],{"class":106},[96,2392,2393,2395,2397,2399,2402,2404,2406,2408,2411],{"class":98,"line":238},[96,2394,241],{"class":106},[96,2396,244],{"class":116},[96,2398,179],{"class":106},[96,2400,2401],{"class":249},"'Parameters Before: '",[96,2403,253],{"class":102},[96,2405,694],{"class":126},[96,2407,130],{"class":106},[96,2409,2410],{"class":116},"_mapToString",[96,2412,298],{"class":106},[96,2414,2415],{"class":98,"line":259},[96,2416,1888],{"class":106},[96,2418,2419],{"class":98,"line":276},[96,2420,1622],{"class":106},[96,2422,2423],{"class":98,"line":301},[96,2424,2425],{"class":234},"    \u002F\u002F Perform modifications\n",[96,2427,2428,2431,2433,2435],{"class":98,"line":306},[96,2429,2430],{"class":126},"    this",[96,2432,130],{"class":106},[96,2434,369],{"class":116},[96,2436,372],{"class":106},[96,2438,2439],{"class":98,"line":312},[96,2440,1622],{"class":106},[96,2442,2443,2445],{"class":98,"line":333},[96,2444,1627],{"class":102},[96,2446,2347],{"class":106},[96,2448,2449,2451,2453,2455,2458,2460,2462,2464,2466],{"class":98,"line":338},[96,2450,241],{"class":106},[96,2452,244],{"class":116},[96,2454,179],{"class":106},[96,2456,2457],{"class":249},"'Parameters After: '",[96,2459,253],{"class":102},[96,2461,694],{"class":126},[96,2463,130],{"class":106},[96,2465,2410],{"class":116},[96,2467,298],{"class":106},[96,2469,2470,2472,2474,2476,2479],{"class":98,"line":344},[96,2471,241],{"class":106},[96,2473,244],{"class":116},[96,2475,179],{"class":106},[96,2477,2478],{"class":249},"'=== End OAuth Debug ==='",[96,2480,185],{"class":106},[96,2482,2483],{"class":98,"line":361},[96,2484,1888],{"class":106},[96,2486,2487],{"class":98,"line":375},[96,2488,1622],{"class":106},[96,2490,2491,2493],{"class":98,"line":381},[96,2492,1917],{"class":102},[96,2494,392],{"class":106},[96,2496,2497],{"class":98,"line":386},[96,2498,1893],{"class":106},[96,2500,2501],{"class":98,"line":395},[96,2502,198],{"emptyLinePlaceholder":197},[96,2504,2505,2507,2509,2511,2513,2516],{"class":98,"line":400},[96,2506,2410],{"class":116},[96,2508,154],{"class":106},[96,2510,157],{"class":102},[96,2512,179],{"class":106},[96,2514,2515],{"class":213},"map",[96,2517,228],{"class":106},[96,2519,2520,2522,2525,2527],{"class":98,"line":405},[96,2521,1603],{"class":102},[96,2523,2524],{"class":106}," result ",[96,2526,110],{"class":102},[96,2528,2529],{"class":106}," {};\n",[96,2531,2532,2534,2537,2539,2542,2545,2548,2551],{"class":98,"line":425},[96,2533,1603],{"class":102},[96,2535,2536],{"class":106}," keys ",[96,2538,110],{"class":102},[96,2540,2541],{"class":106}," map.",[96,2543,2544],{"class":116},"keySet",[96,2546,2547],{"class":106},"().",[96,2549,2550],{"class":116},"toArray",[96,2552,120],{"class":106},[96,2554,2555,2558,2560,2562,2564,2566,2568,2570,2572,2575,2577,2580,2582],{"class":98,"line":431},[96,2556,2557],{"class":102},"    for",[96,2559,856],{"class":106},[96,2561,103],{"class":102},[96,2563,1417],{"class":106},[96,2565,110],{"class":102},[96,2567,1422],{"class":126},[96,2569,1425],{"class":106},[96,2571,1428],{"class":102},[96,2573,2574],{"class":106}," keys.",[96,2576,633],{"class":126},[96,2578,2579],{"class":106},"; i",[96,2581,1434],{"class":102},[96,2583,228],{"class":106},[96,2585,2586,2588,2591,2593],{"class":98,"line":446},[96,2587,1158],{"class":102},[96,2589,2590],{"class":106}," key ",[96,2592,110],{"class":102},[96,2594,2595],{"class":106}," keys[i];\n",[96,2597,2598,2600,2603,2605,2607,2609],{"class":98,"line":452},[96,2599,1158],{"class":102},[96,2601,2602],{"class":106}," value ",[96,2604,110],{"class":102},[96,2606,2541],{"class":106},[96,2608,498],{"class":116},[96,2610,2611],{"class":106},"(key);\n",[96,2613,2614],{"class":98,"line":458},[96,2615,2616],{"class":234},"        \u002F\u002F Mask sensitive values\n",[96,2618,2619,2621,2624,2627,2629,2632,2634,2637,2639,2642,2645,2648,2650],{"class":98,"line":464},[96,2620,347],{"class":102},[96,2622,2623],{"class":106}," (key.",[96,2625,2626],{"class":116},"toLowerCase",[96,2628,2547],{"class":106},[96,2630,2631],{"class":116},"indexOf",[96,2633,179],{"class":106},[96,2635,2636],{"class":249},"'secret'",[96,2638,1941],{"class":106},[96,2640,2641],{"class":102},">",[96,2643,2644],{"class":102}," -",[96,2646,2647],{"class":126},"1",[96,2649,642],{"class":102},[96,2651,2652],{"class":106}," \n",[96,2654,2655,2658,2660,2662,2664,2666,2669,2671,2673,2675,2677],{"class":98,"line":484},[96,2656,2657],{"class":106},"            key.",[96,2659,2626],{"class":116},[96,2661,2547],{"class":106},[96,2663,2631],{"class":116},[96,2665,179],{"class":106},[96,2667,2668],{"class":249},"'password'",[96,2670,1941],{"class":106},[96,2672,2641],{"class":102},[96,2674,2644],{"class":102},[96,2676,2647],{"class":126},[96,2678,228],{"class":106},[96,2680,2681,2684,2686,2689],{"class":98,"line":507},[96,2682,2683],{"class":106},"            result[key] ",[96,2685,110],{"class":102},[96,2687,2688],{"class":249}," '***MASKED***'",[96,2690,1365],{"class":106},[96,2692,2693,2695,2697],{"class":98,"line":525},[96,2694,1034],{"class":106},[96,2696,1037],{"class":102},[96,2698,1920],{"class":106},[96,2700,2701,2703,2705],{"class":98,"line":545},[96,2702,2683],{"class":106},[96,2704,110],{"class":102},[96,2706,2707],{"class":106}," value;\n",[96,2709,2710],{"class":98,"line":551},[96,2711,378],{"class":106},[96,2713,2714],{"class":98,"line":556},[96,2715,1888],{"class":106},[96,2717,2718,2720,2722,2724,2726],{"class":98,"line":562},[96,2719,1917],{"class":102},[96,2721,290],{"class":126},[96,2723,130],{"class":106},[96,2725,295],{"class":116},[96,2727,2728],{"class":106},"(result);\n",[96,2730,2731],{"class":98,"line":578},[96,2732,2257],{"class":106},[1548,2734,2735],{"start":123},[30,2736,2737,2272],{},[33,2738,2739],{},"Test Different Scenarios",[86,2741,2743],{"className":88,"code":2742,"language":90,"meta":91,"style":91},"\u002F\u002F Create a test script include to validate parameter modifications\nvar OAuthParameterTest = Class.create();\nOAuthParameterTest.prototype = {\n    testNetSuiteParameters: function() {\n        var customOAuth = new CustomOAuthUtil();\n        var testMap = new Packages.java.util.HashMap();\n        \n        \u002F\u002F Simulate authorization code flow\n        testMap.put('grant_type', 'authorization_code');\n        testMap.put('code', 'test_auth_code');\n        testMap.put('redirect_uri', 'https:\u002F\u002Finstance.service-now.com\u002Foauth_redirect.do');\n        testMap.put('code_verifier', 'test_verifier');\n        \n        customOAuth.interceptRequestParameters(testMap, 'authorization_code', 'NetSuite OAuth Provider');\n        \n        \u002F\u002F Verify modifications\n        gs.info('Test Results:');\n        gs.info('code_verifier removed: ' + !testMap.containsKey('code_verifier'));\n        gs.info('grant_type value: ' + testMap.get('grant_type'));\n    },\n    \n    type: 'OAuthParameterTest'\n};\n",[93,2744,2745,2750,2765,2778,2789,2805,2824,2828,2833,2850,2868,2885,2902,2906,2925,2929,2934,2947,2974,2998,3002,3006,3013],{"__ignoreMap":91},[96,2746,2747],{"class":98,"line":99},[96,2748,2749],{"class":234},"\u002F\u002F Create a test script include to validate parameter modifications\n",[96,2751,2752,2754,2757,2759,2761,2763],{"class":98,"line":123},[96,2753,103],{"class":102},[96,2755,2756],{"class":106}," OAuthParameterTest ",[96,2758,110],{"class":102},[96,2760,113],{"class":106},[96,2762,117],{"class":116},[96,2764,120],{"class":106},[96,2766,2767,2770,2772,2774,2776],{"class":98,"line":148},[96,2768,2769],{"class":126},"OAuthParameterTest",[96,2771,130],{"class":106},[96,2773,133],{"class":126},[96,2775,136],{"class":102},[96,2777,1920],{"class":106},[96,2779,2780,2783,2785,2787],{"class":98,"line":163},[96,2781,2782],{"class":116},"    testNetSuiteParameters",[96,2784,154],{"class":106},[96,2786,157],{"class":102},[96,2788,160],{"class":106},[96,2790,2791,2793,2796,2798,2800,2803],{"class":98,"line":188},[96,2792,1158],{"class":102},[96,2794,2795],{"class":106}," customOAuth ",[96,2797,110],{"class":102},[96,2799,1166],{"class":102},[96,2801,2802],{"class":116}," CustomOAuthUtil",[96,2804,120],{"class":106},[96,2806,2807,2809,2812,2814,2816,2819,2822],{"class":98,"line":194},[96,2808,1158],{"class":102},[96,2810,2811],{"class":106}," testMap ",[96,2813,110],{"class":102},[96,2815,1166],{"class":102},[96,2817,2818],{"class":106}," Packages.java.util.",[96,2820,2821],{"class":116},"HashMap",[96,2823,120],{"class":106},[96,2825,2826],{"class":98,"line":201},[96,2827,1206],{"class":106},[96,2829,2830],{"class":98,"line":231},[96,2831,2832],{"class":234},"        \u002F\u002F Simulate authorization code flow\n",[96,2834,2835,2838,2840,2842,2844,2846,2848],{"class":98,"line":238},[96,2836,2837],{"class":106},"        testMap.",[96,2839,531],{"class":116},[96,2841,179],{"class":106},[96,2843,478],{"class":249},[96,2845,217],{"class":106},[96,2847,540],{"class":249},[96,2849,185],{"class":106},[96,2851,2852,2854,2856,2858,2861,2863,2866],{"class":98,"line":259},[96,2853,2837],{"class":106},[96,2855,531],{"class":116},[96,2857,179],{"class":106},[96,2859,2860],{"class":249},"'code'",[96,2862,217],{"class":106},[96,2864,2865],{"class":249},"'test_auth_code'",[96,2867,185],{"class":106},[96,2869,2870,2872,2874,2876,2878,2880,2883],{"class":98,"line":276},[96,2871,2837],{"class":106},[96,2873,531],{"class":116},[96,2875,179],{"class":106},[96,2877,1770],{"class":249},[96,2879,217],{"class":106},[96,2881,2882],{"class":249},"'https:\u002F\u002Finstance.service-now.com\u002Foauth_redirect.do'",[96,2884,185],{"class":106},[96,2886,2887,2889,2891,2893,2895,2897,2900],{"class":98,"line":301},[96,2888,2837],{"class":106},[96,2890,531],{"class":116},[96,2892,179],{"class":106},[96,2894,573],{"class":249},[96,2896,217],{"class":106},[96,2898,2899],{"class":249},"'test_verifier'",[96,2901,185],{"class":106},[96,2903,2904],{"class":98,"line":306},[96,2905,1206],{"class":106},[96,2907,2908,2911,2913,2916,2918,2920,2923],{"class":98,"line":312},[96,2909,2910],{"class":106},"        customOAuth.",[96,2912,2287],{"class":116},[96,2914,2915],{"class":106},"(testMap, ",[96,2917,540],{"class":249},[96,2919,217],{"class":106},[96,2921,2922],{"class":249},"'NetSuite OAuth Provider'",[96,2924,185],{"class":106},[96,2926,2927],{"class":98,"line":333},[96,2928,1206],{"class":106},[96,2930,2931],{"class":98,"line":338},[96,2932,2933],{"class":234},"        \u002F\u002F Verify modifications\n",[96,2935,2936,2938,2940,2942,2945],{"class":98,"line":344},[96,2937,241],{"class":106},[96,2939,244],{"class":116},[96,2941,179],{"class":106},[96,2943,2944],{"class":249},"'Test Results:'",[96,2946,185],{"class":106},[96,2948,2949,2951,2953,2955,2958,2960,2963,2966,2968,2970,2972],{"class":98,"line":361},[96,2950,241],{"class":106},[96,2952,244],{"class":116},[96,2954,179],{"class":106},[96,2956,2957],{"class":249},"'code_verifier removed: '",[96,2959,253],{"class":102},[96,2961,2962],{"class":102}," !",[96,2964,2965],{"class":106},"testMap.",[96,2967,473],{"class":116},[96,2969,179],{"class":106},[96,2971,573],{"class":249},[96,2973,1475],{"class":106},[96,2975,2976,2978,2980,2982,2985,2987,2990,2992,2994,2996],{"class":98,"line":375},[96,2977,241],{"class":106},[96,2979,244],{"class":116},[96,2981,179],{"class":106},[96,2983,2984],{"class":249},"'grant_type value: '",[96,2986,253],{"class":102},[96,2988,2989],{"class":106}," testMap.",[96,2991,498],{"class":116},[96,2993,179],{"class":106},[96,2995,478],{"class":249},[96,2997,1475],{"class":106},[96,2999,3000],{"class":98,"line":381},[96,3001,191],{"class":106},[96,3003,3004],{"class":98,"line":386},[96,3005,1622],{"class":106},[96,3007,3008,3010],{"class":98,"line":395},[96,3009,1530],{"class":106},[96,3011,3012],{"class":249},"'OAuthParameterTest'\n",[96,3014,3015],{"class":98,"line":400},[96,3016,3017],{"class":106},"};\n",[19,3019,3021],{"id":3020},"best-practices-and-considerations","Best Practices and Considerations",[12,3023,3024],{},"When implementing OAuth2 parameter customization:",[1548,3026,3027,3033,3039,3045,3051],{},[30,3028,3029,3032],{},[33,3030,3031],{},"Security First",": Never log sensitive information like client secrets or tokens",[30,3034,3035,3038],{},[33,3036,3037],{},"Provider-Specific Logic",": Use provider names to ensure modifications only apply to specific integrations",[30,3040,3041,3044],{},[33,3042,3043],{},"Maintain Compatibility",": Always call the parent method to preserve default ServiceNow functionality",[30,3046,3047,3050],{},[33,3048,3049],{},"Error Handling",": Implement try-catch blocks to prevent integration failures",[30,3052,3053,3056],{},[33,3054,3055],{},"Documentation",": Document all parameter modifications for future maintenance",[19,3058,3060],{"id":3059},"netsuite-specific-pkce-requirements","NetSuite-Specific PKCE Requirements",[12,3062,3063],{},"NetSuite has unique requirements for PKCE (Proof Key for Code Exchange) parameters that differ from standard OAuth2 implementations:",[78,3065,3067],{"id":3066},"code_verifier-requirements","code_verifier Requirements",[1548,3069,3070,3076,3081],{},[30,3071,3072,3075],{},[33,3073,3074],{},"SHA256 Hashing",": The code_verifier must be hashed using SHA256",[30,3077,3078,42],{},[33,3079,3080],{},"Length Validation",[30,3082,3083,3086],{},[33,3084,3085],{},"Base64URL Encoding",": The hashed value must use URL-safe base64 encoding",[78,3088,3090],{"id":3089},"code_challenge-and-code_challenge_method-relationship","code_challenge and code_challenge_method Relationship",[12,3092,3093],{},"According to the PKCE specification (RFC 7636), NetSuite enforces these rules:",[1548,3095,3096,3102,3108],{},[30,3097,3098,3101],{},[33,3099,3100],{},"code_challenge_method is mandatory",": If code_challenge is present, code_challenge_method MUST also be included",[30,3103,3104,3107],{},[33,3105,3106],{},"SHA256 only",": The code_challenge_method parameter must be set to 'S256' (SHA256)",[30,3109,3110,3113],{},[33,3111,3112],{},"Parameter association",": Both parameters are associated with the authorization code for verification",[12,3115,3116],{},"Here's a complete implementation that handles these requirements:",[86,3118,3120],{"className":88,"code":3119,"language":90,"meta":91,"style":91},"_customizeNetSuiteParameters: function(requestParameterMap, flow) {\n    if (flow == 'authorization_code') {\n        \u002F\u002F 1. Handle code_verifier with SHA256 hashing\n        if (requestParameterMap.containsKey('code_verifier')) {\n            var codeVerifier = requestParameterMap.get('code_verifier');\n            \n            \u002F\u002F Validate length\n            if (codeVerifier.length \u003C 43 || codeVerifier.length > 128) {\n                gs.warn('Code verifier length (' + codeVerifier.length + ') outside required range');\n                \u002F\u002F You may want to throw an error or regenerate\n            }\n            \n            \u002F\u002F Apply SHA256 hash\n            var hashedVerifier = this._hashCodeVerifier(codeVerifier);\n            requestParameterMap.put('code_verifier', hashedVerifier);\n        }\n        \n        \u002F\u002F 2. Handle code_challenge and code_challenge_method relationship\n        if (requestParameterMap.containsKey('code_challenge')) {\n            \u002F\u002F NetSuite requires code_challenge_method when code_challenge is present\n            if (!requestParameterMap.containsKey('code_challenge_method')) {\n                gs.warn('code_challenge present without code_challenge_method - adding S256');\n            }\n            \u002F\u002F Always set to S256 for NetSuite\n            requestParameterMap.put('code_challenge_method', 'S256');\n        }\n        \n        \u002F\u002F 3. Ensure correct grant_type format\n        requestParameterMap.put('grant_type', 'authorization_code');\n        \n        \u002F\u002F 4. Add NetSuite-specific parameters\n        if (!requestParameterMap.containsKey('access_type')) {\n            requestParameterMap.put('access_type', 'offline');\n        }\n        \n        \u002F\u002F 5. Format scope correctly for NetSuite\n        if (requestParameterMap.containsKey('scope')) {\n            var scope = requestParameterMap.get('scope');\n            \u002F\u002F NetSuite expects space-separated scopes\n            scope = scope.replace(\u002F,\u002Fg, ' ');\n            requestParameterMap.put('scope', scope);\n        }\n    }\n},\n\n_hashCodeVerifier: function(codeVerifier) {\n    \u002F\u002F Use ServiceNow's crypto utilities for SHA256\n    var crypto = new GlideCertificateEncryption();\n    var hashedBytes = crypto.generateMac(codeVerifier, 'SHA-256', '');\n    \n    \u002F\u002F Convert to base64url (URL-safe base64)\n    var base64 = GlideStringUtil.base64Encode(hashedBytes);\n    return base64.replace(\u002F\\+\u002Fg, '-').replace(\u002F\\\u002F\u002Fg, '_').replace(\u002F=\u002Fg, '');\n}\n",[93,3121,3122,3140,3152,3157,3171,3189,3193,3198,3222,3246,3251,3255,3259,3264,3280,3292,3296,3300,3305,3319,3324,3342,3355,3359,3364,3380,3384,3388,3393,3410,3414,3419,3438,3455,3459,3463,3468,3482,3500,3505,3528,3540,3544,3548,3552,3556,3570,3575,3589,3611,3615,3620,3634,3690],{"__ignoreMap":91},[96,3123,3124,3126,3128,3130,3132,3134,3136,3138],{"class":98,"line":99},[96,3125,369],{"class":116},[96,3127,154],{"class":106},[96,3129,157],{"class":102},[96,3131,179],{"class":106},[96,3133,214],{"class":213},[96,3135,217],{"class":106},[96,3137,220],{"class":213},[96,3139,228],{"class":106},[96,3141,3142,3144,3146,3148,3150],{"class":98,"line":123},[96,3143,1627],{"class":102},[96,3145,436],{"class":106},[96,3147,353],{"class":102},[96,3149,441],{"class":249},[96,3151,228],{"class":106},[96,3153,3154],{"class":98,"line":148},[96,3155,3156],{"class":234},"        \u002F\u002F 1. Handle code_verifier with SHA256 hashing\n",[96,3158,3159,3161,3163,3165,3167,3169],{"class":98,"line":163},[96,3160,347],{"class":102},[96,3162,470],{"class":106},[96,3164,473],{"class":116},[96,3166,179],{"class":106},[96,3168,573],{"class":249},[96,3170,481],{"class":106},[96,3172,3173,3175,3177,3179,3181,3183,3185,3187],{"class":98,"line":188},[96,3174,1652],{"class":102},[96,3176,583],{"class":106},[96,3178,110],{"class":102},[96,3180,495],{"class":106},[96,3182,498],{"class":116},[96,3184,179],{"class":106},[96,3186,573],{"class":249},[96,3188,185],{"class":106},[96,3190,3191],{"class":98,"line":194},[96,3192,455],{"class":106},[96,3194,3195],{"class":98,"line":201},[96,3196,3197],{"class":234},"            \u002F\u002F Validate length\n",[96,3199,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220],{"class":98,"line":231},[96,3201,467],{"class":102},[96,3203,630],{"class":106},[96,3205,633],{"class":126},[96,3207,636],{"class":102},[96,3209,639],{"class":126},[96,3211,642],{"class":102},[96,3213,645],{"class":106},[96,3215,633],{"class":126},[96,3217,650],{"class":102},[96,3219,653],{"class":126},[96,3221,228],{"class":106},[96,3223,3224,3226,3228,3230,3233,3235,3237,3239,3241,3244],{"class":98,"line":238},[96,3225,510],{"class":106},[96,3227,878],{"class":116},[96,3229,179],{"class":106},[96,3231,3232],{"class":249},"'Code verifier length ('",[96,3234,253],{"class":102},[96,3236,645],{"class":106},[96,3238,633],{"class":126},[96,3240,253],{"class":102},[96,3242,3243],{"class":249}," ') outside required range'",[96,3245,185],{"class":106},[96,3247,3248],{"class":98,"line":259},[96,3249,3250],{"class":234},"                \u002F\u002F You may want to throw an error or regenerate\n",[96,3252,3253],{"class":98,"line":276},[96,3254,548],{"class":106},[96,3256,3257],{"class":98,"line":301},[96,3258,455],{"class":106},[96,3260,3261],{"class":98,"line":306},[96,3262,3263],{"class":234},"            \u002F\u002F Apply SHA256 hash\n",[96,3265,3266,3268,3270,3272,3274,3276,3278],{"class":98,"line":312},[96,3267,1652],{"class":102},[96,3269,726],{"class":106},[96,3271,110],{"class":102},[96,3273,694],{"class":126},[96,3275,130],{"class":106},[96,3277,735],{"class":116},[96,3279,738],{"class":106},[96,3281,3282,3284,3286,3288,3290],{"class":98,"line":333},[96,3283,1672],{"class":106},[96,3285,531],{"class":116},[96,3287,179],{"class":106},[96,3289,573],{"class":249},[96,3291,752],{"class":106},[96,3293,3294],{"class":98,"line":338},[96,3295,378],{"class":106},[96,3297,3298],{"class":98,"line":344},[96,3299,1206],{"class":106},[96,3301,3302],{"class":98,"line":361},[96,3303,3304],{"class":234},"        \u002F\u002F 2. Handle code_challenge and code_challenge_method relationship\n",[96,3306,3307,3309,3311,3313,3315,3317],{"class":98,"line":375},[96,3308,347],{"class":102},[96,3310,470],{"class":106},[96,3312,473],{"class":116},[96,3314,179],{"class":106},[96,3316,796],{"class":249},[96,3318,481],{"class":106},[96,3320,3321],{"class":98,"line":381},[96,3322,3323],{"class":234},"            \u002F\u002F NetSuite requires code_challenge_method when code_challenge is present\n",[96,3325,3326,3328,3330,3332,3334,3336,3338,3340],{"class":98,"line":386},[96,3327,467],{"class":102},[96,3329,856],{"class":106},[96,3331,859],{"class":102},[96,3333,862],{"class":106},[96,3335,473],{"class":116},[96,3337,179],{"class":106},[96,3339,816],{"class":249},[96,3341,481],{"class":106},[96,3343,3344,3346,3348,3350,3353],{"class":98,"line":395},[96,3345,510],{"class":106},[96,3347,878],{"class":116},[96,3349,179],{"class":106},[96,3351,3352],{"class":249},"'code_challenge present without code_challenge_method - adding S256'",[96,3354,185],{"class":106},[96,3356,3357],{"class":98,"line":400},[96,3358,548],{"class":106},[96,3360,3361],{"class":98,"line":405},[96,3362,3363],{"class":234},"            \u002F\u002F Always set to S256 for NetSuite\n",[96,3365,3366,3368,3370,3372,3374,3376,3378],{"class":98,"line":425},[96,3367,1672],{"class":106},[96,3369,531],{"class":116},[96,3371,179],{"class":106},[96,3373,816],{"class":249},[96,3375,217],{"class":106},[96,3377,821],{"class":249},[96,3379,185],{"class":106},[96,3381,3382],{"class":98,"line":431},[96,3383,378],{"class":106},[96,3385,3386],{"class":98,"line":446},[96,3387,1206],{"class":106},[96,3389,3390],{"class":98,"line":452},[96,3391,3392],{"class":234},"        \u002F\u002F 3. Ensure correct grant_type format\n",[96,3394,3395,3398,3400,3402,3404,3406,3408],{"class":98,"line":458},[96,3396,3397],{"class":106},"        requestParameterMap.",[96,3399,531],{"class":116},[96,3401,179],{"class":106},[96,3403,478],{"class":249},[96,3405,217],{"class":106},[96,3407,540],{"class":249},[96,3409,185],{"class":106},[96,3411,3412],{"class":98,"line":464},[96,3413,1206],{"class":106},[96,3415,3416],{"class":98,"line":484},[96,3417,3418],{"class":234},"        \u002F\u002F 4. Add NetSuite-specific parameters\n",[96,3420,3421,3423,3425,3427,3429,3431,3433,3436],{"class":98,"line":507},[96,3422,347],{"class":102},[96,3424,856],{"class":106},[96,3426,859],{"class":102},[96,3428,862],{"class":106},[96,3430,473],{"class":116},[96,3432,179],{"class":106},[96,3434,3435],{"class":249},"'access_type'",[96,3437,481],{"class":106},[96,3439,3440,3442,3444,3446,3448,3450,3453],{"class":98,"line":525},[96,3441,1672],{"class":106},[96,3443,531],{"class":116},[96,3445,179],{"class":106},[96,3447,3435],{"class":249},[96,3449,217],{"class":106},[96,3451,3452],{"class":249},"'offline'",[96,3454,185],{"class":106},[96,3456,3457],{"class":98,"line":545},[96,3458,378],{"class":106},[96,3460,3461],{"class":98,"line":551},[96,3462,1206],{"class":106},[96,3464,3465],{"class":98,"line":556},[96,3466,3467],{"class":234},"        \u002F\u002F 5. Format scope correctly for NetSuite\n",[96,3469,3470,3472,3474,3476,3478,3480],{"class":98,"line":562},[96,3471,347],{"class":102},[96,3473,470],{"class":106},[96,3475,473],{"class":116},[96,3477,179],{"class":106},[96,3479,938],{"class":249},[96,3481,481],{"class":106},[96,3483,3484,3486,3488,3490,3492,3494,3496,3498],{"class":98,"line":578},[96,3485,1652],{"class":102},[96,3487,948],{"class":106},[96,3489,110],{"class":102},[96,3491,495],{"class":106},[96,3493,498],{"class":116},[96,3495,179],{"class":106},[96,3497,938],{"class":249},[96,3499,185],{"class":106},[96,3501,3502],{"class":98,"line":598},[96,3503,3504],{"class":234},"            \u002F\u002F NetSuite expects space-separated scopes\n",[96,3506,3507,3510,3512,3514,3516,3518,3520,3522,3524,3526],{"class":98,"line":612},[96,3508,3509],{"class":106},"            scope ",[96,3511,110],{"class":102},[96,3513,977],{"class":106},[96,3515,980],{"class":116},[96,3517,179],{"class":106},[96,3519,985],{"class":249},[96,3521,988],{"class":102},[96,3523,217],{"class":106},[96,3525,993],{"class":249},[96,3527,185],{"class":106},[96,3529,3530,3532,3534,3536,3538],{"class":98,"line":618},[96,3531,1672],{"class":106},[96,3533,531],{"class":116},[96,3535,179],{"class":106},[96,3537,938],{"class":249},[96,3539,1009],{"class":106},[96,3541,3542],{"class":98,"line":624},[96,3543,378],{"class":106},[96,3545,3546],{"class":98,"line":658},[96,3547,1888],{"class":106},[96,3549,3550],{"class":98,"line":680},[96,3551,1893],{"class":106},[96,3553,3554],{"class":98,"line":686},[96,3555,198],{"emptyLinePlaceholder":197},[96,3557,3558,3560,3562,3564,3566,3568],{"class":98,"line":704},[96,3559,735],{"class":116},[96,3561,154],{"class":106},[96,3563,157],{"class":102},[96,3565,179],{"class":106},[96,3567,1144],{"class":213},[96,3569,228],{"class":106},[96,3571,3572],{"class":98,"line":710},[96,3573,3574],{"class":234},"    \u002F\u002F Use ServiceNow's crypto utilities for SHA256\n",[96,3576,3577,3579,3581,3583,3585,3587],{"class":98,"line":715},[96,3578,1603],{"class":102},[96,3580,1161],{"class":106},[96,3582,110],{"class":102},[96,3584,1166],{"class":102},[96,3586,1169],{"class":116},[96,3588,120],{"class":106},[96,3590,3591,3593,3595,3597,3599,3601,3603,3605,3607,3609],{"class":98,"line":721},[96,3592,1603],{"class":102},[96,3594,1179],{"class":106},[96,3596,110],{"class":102},[96,3598,1184],{"class":106},[96,3600,1187],{"class":116},[96,3602,1190],{"class":106},[96,3604,1193],{"class":249},[96,3606,217],{"class":106},[96,3608,1198],{"class":249},[96,3610,185],{"class":106},[96,3612,3613],{"class":98,"line":741},[96,3614,1622],{"class":106},[96,3616,3617],{"class":98,"line":755},[96,3618,3619],{"class":234},"    \u002F\u002F Convert to base64url (URL-safe base64)\n",[96,3621,3622,3624,3626,3628,3630,3632],{"class":98,"line":769},[96,3623,1603],{"class":102},[96,3625,1220],{"class":106},[96,3627,110],{"class":102},[96,3629,1225],{"class":106},[96,3631,1228],{"class":116},[96,3633,1231],{"class":106},[96,3635,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676,3678,3680,3682,3684,3686,3688],{"class":98,"line":774},[96,3637,1917],{"class":102},[96,3639,1250],{"class":106},[96,3641,980],{"class":116},[96,3643,179],{"class":106},[96,3645,1257],{"class":249},[96,3647,1261],{"class":1260},[96,3649,1257],{"class":249},[96,3651,988],{"class":102},[96,3653,217],{"class":106},[96,3655,1270],{"class":249},[96,3657,1273],{"class":106},[96,3659,980],{"class":116},[96,3661,179],{"class":106},[96,3663,1257],{"class":249},[96,3665,1282],{"class":1260},[96,3667,1257],{"class":249},[96,3669,988],{"class":102},[96,3671,217],{"class":106},[96,3673,1291],{"class":249},[96,3675,1273],{"class":106},[96,3677,980],{"class":116},[96,3679,179],{"class":106},[96,3681,1300],{"class":249},[96,3683,988],{"class":102},[96,3685,217],{"class":106},[96,3687,1198],{"class":249},[96,3689,185],{"class":106},[96,3691,3692],{"class":98,"line":779},[96,3693,2257],{"class":106},[19,3695,3697],{"id":3696},"conclusion","Conclusion",[12,3699,3700],{},"Customizing OAuth2 parameters in ServiceNow by extending the OAuthUtil script include provides the flexibility needed to integrate with systems like NetSuite that have specific authentication requirements. This approach maintains the integrity of ServiceNow's OAuth2 framework while allowing for the customizations necessary for successful integration.",[12,3702,3703],{},"Remember to thoroughly test your modifications in a development environment and monitor the OAuth2 flow closely when first implementing these changes in production. The ability to intercept and modify request parameters gives you complete control over the OAuth2 token exchange process, ensuring successful integration with even the most demanding external systems.",[3705,3706,3707],"style",{},"html pre.shiki code .sCydW, html code.shiki .sCydW{--shiki-default:#D73A49;--shiki-dark:#D73A49}html pre.shiki code .sKWpL, html code.shiki .sKWpL{--shiki-default:#24292E;--shiki-dark:#24292E}html pre.shiki code .se37E, html code.shiki .se37E{--shiki-default:#6F42C1;--shiki-dark:#6F42C1}html pre.shiki code .sMN4m, html code.shiki .sMN4m{--shiki-default:#005CC5;--shiki-dark:#005CC5}html pre.shiki code .sj_tP, html code.shiki .sj_tP{--shiki-default:#E36209;--shiki-dark:#E36209}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sOTlB, html code.shiki .sOTlB{--shiki-default:#032F62;--shiki-dark:#032F62}html pre.shiki code .sc-UE, html code.shiki .sc-UE{--shiki-default:#22863A;--shiki-default-font-weight:bold;--shiki-dark:#22863A;--shiki-dark-font-weight:bold}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":91,"searchDepth":123,"depth":123,"links":3709},[3710,3711,3717,3718,3722],{"id":21,"depth":123,"text":22},{"id":69,"depth":123,"text":70,"children":3712},[3713,3714,3715,3716],{"id":80,"depth":148,"text":81},{"id":1542,"depth":148,"text":1543},{"id":1566,"depth":148,"text":1567},{"id":2260,"depth":148,"text":2261},{"id":3020,"depth":123,"text":3021},{"id":3059,"depth":123,"text":3060,"children":3719},[3720,3721],{"id":3066,"depth":148,"text":3067},{"id":3089,"depth":148,"text":3090},{"id":3696,"depth":123,"text":3697},"2025-07-16T10:00:00","Learn how to modify OAuth2 request parameters in ServiceNow by extending OAuthUtil for NetSuite and other integrations","customizing-oauth2-parameters-servicenow-netsuite",null,"md",[3729,3732,3735,3738],{"question":3730,"answer":3731},"Why do I need to customize OAuth2 parameters in ServiceNow?","Some external systems like NetSuite require specific parameter formats or additional parameters that aren't included in ServiceNow's default OAuth2 implementation. Customizing parameters ensures successful authentication and token exchange.",{"question":3733,"answer":3734},"What is the interceptRequestParameters function?","The interceptRequestParameters function is a method in ServiceNow's OAuthUtil script include that allows you to modify OAuth2 request parameters before they're sent to the authorization server. You can add, modify, or remove parameters as needed.",{"question":3736,"answer":3737},"Can I use this method for other OAuth2 integrations besides NetSuite?","Yes, extending OAuthUtil and customizing the interceptRequestParameters function works for any OAuth2 integration in ServiceNow where you need to modify default request parameters.",{"question":3739,"answer":3740},"What are common parameters that need modification for NetSuite?","NetSuite requires specific handling of the code_verifier parameter (SHA256 hashing with 43-128 character length), specific grant_type formats, custom scope parameters, and other PKCE-related modifications.","Customizing OAuth2 Parameters in ServiceNow for NetSuite Integration",{},"\u002Fblog\u002Fcustomizing-oauth2-parameters-servicenow-netsuite",{"title":5,"description":3724},{"src":3746,"mime":3747,"alt":3748,"width":3749,"height":3750},"\u002Fmeta-img.webp","webp","ServiceNow OAuth2 customization for NetSuite integration",1200,630,"blog\u002Fcustomizing-oauth2-parameters-servicenow-netsuite",[3753,3754,3755,3756,3757,3758,3759],"ServiceNow","OAuth2","NetSuite","Integration","REST API","Script Include","Authentication","OZZGlWYmgfgHlIff4o4sPBLWkfIa3k9JfYll6Zng66I",1788768209961]