<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Accessing User Content From ArcGIS Rest API Using Custom Widget Getting Invalid Token Error in ArcGIS Experience Builder Questions</title>
    <link>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1613504#M18892</link>
    <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I was trying to explore user contents by following the documents &lt;A href="https://developers.arcgis.com/rest/users-groups-and-items/user-content/" target="_blank"&gt;https://developers.arcgis.com/rest/users-groups-and-items/user-content/&lt;/A&gt;,&amp;nbsp;and I used the API&amp;nbsp;&lt;SPAN&gt;&lt;A href="https://machine.domain.com/webadaptor/sharing/rest/content/users/jsmith?sf=json&amp;amp;token=mytoken" target="_blank"&gt;https://machine.domain.com/webadaptor/sharing/rest/content/users/jsmith?sf=json&amp;amp;token=mytoken&lt;/A&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;Option 1:&lt;/STRONG&gt; When the token is generated from&amp;nbsp;&lt;A href="https://machine.domain.com/webadaptor/sharing/rest/generateToken" target="_blank"&gt;https://machine.domain.com/webadaptor/sharing/rest/generateToken&lt;/A&gt;, the content API is working perfectly from Postman, but from the widget, it is getting the error "Invalid token.".&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="sakildev1_0-1746903108352.png" style="width: 400px;"&gt;&lt;img src="https://community.esri.com/t5/image/serverpage/image-id/131940i0E22B2E5B60CF215/image-size/medium?v=v2&amp;amp;px=400" role="button" title="sakildev1_0-1746903108352.png" alt="sakildev1_0-1746903108352.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Option 2:&lt;/STRONG&gt; If the token is generated from Python, then the API is working perfectly, both from the widget and Postman&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;gis = GIS(portal_url, username, password)&lt;BR /&gt;print(gis._con.token)&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;I am seeking help to get a prompt solution to work with &lt;STRONG&gt;Option A&lt;/STRONG&gt; because the token is generated from a .NET application.&lt;BR /&gt;&lt;BR /&gt;Thank you&lt;BR /&gt;Sakil&lt;/P&gt;</description>
    <pubDate>Sat, 10 May 2025 19:08:13 GMT</pubDate>
    <dc:creator>sakildev1</dc:creator>
    <dc:date>2025-05-10T19:08:13Z</dc:date>
    <item>
      <title>Accessing User Content From ArcGIS Rest API Using Custom Widget Getting Invalid Token Error</title>
      <link>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1613504#M18892</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I was trying to explore user contents by following the documents &lt;A href="https://developers.arcgis.com/rest/users-groups-and-items/user-content/" target="_blank"&gt;https://developers.arcgis.com/rest/users-groups-and-items/user-content/&lt;/A&gt;,&amp;nbsp;and I used the API&amp;nbsp;&lt;SPAN&gt;&lt;A href="https://machine.domain.com/webadaptor/sharing/rest/content/users/jsmith?sf=json&amp;amp;token=mytoken" target="_blank"&gt;https://machine.domain.com/webadaptor/sharing/rest/content/users/jsmith?sf=json&amp;amp;token=mytoken&lt;/A&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;Option 1:&lt;/STRONG&gt; When the token is generated from&amp;nbsp;&lt;A href="https://machine.domain.com/webadaptor/sharing/rest/generateToken" target="_blank"&gt;https://machine.domain.com/webadaptor/sharing/rest/generateToken&lt;/A&gt;, the content API is working perfectly from Postman, but from the widget, it is getting the error "Invalid token.".&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="sakildev1_0-1746903108352.png" style="width: 400px;"&gt;&lt;img src="https://community.esri.com/t5/image/serverpage/image-id/131940i0E22B2E5B60CF215/image-size/medium?v=v2&amp;amp;px=400" role="button" title="sakildev1_0-1746903108352.png" alt="sakildev1_0-1746903108352.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Option 2:&lt;/STRONG&gt; If the token is generated from Python, then the API is working perfectly, both from the widget and Postman&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;gis = GIS(portal_url, username, password)&lt;BR /&gt;print(gis._con.token)&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;I am seeking help to get a prompt solution to work with &lt;STRONG&gt;Option A&lt;/STRONG&gt; because the token is generated from a .NET application.&lt;BR /&gt;&lt;BR /&gt;Thank you&lt;BR /&gt;Sakil&lt;/P&gt;</description>
      <pubDate>Sat, 10 May 2025 19:08:13 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1613504#M18892</guid>
      <dc:creator>sakildev1</dc:creator>
      <dc:date>2025-05-10T19:08:13Z</dc:date>
    </item>
    <item>
      <title>Re: Accessing User Content From ArcGIS Rest API Using Custom Widget Getting Invalid Token Error</title>
      <link>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1614111#M18921</link>
      <description>&lt;P&gt;I have a few questions.&lt;BR /&gt;&lt;BR /&gt;first: You said the 'token is generated from a .Net application'? Its my understanding that the rest endpoint for generateToken is an ArcGIS endpoint.&amp;nbsp; I don't know that it is specifically .Net but that should not matter.&lt;BR /&gt;&lt;BR /&gt;second: You said a custom widget was having issues, could you show us the bit of code that makes the call to that endpoint?&amp;nbsp; Specifically, I'm wondering if you've not set it up to make the call asynchronously and wait for a callback.&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;So I was expecting some kind of code which might look like this (note you'd have to have the correct url for the rest api endpoint, and its not wise to hard code username/pwd into a script like this for use in production, but you could use it to test out whether the endpoint is returning a token correctly)&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;async function generateToken(): Promise&amp;lt;string | null&amp;gt; {
  const tokenUrl = "https://machine.domain.com/webadaptor/sharing/rest/generateToken";

  const params = new URLSearchParams();
  params.append("username", "your-username");
  params.append("password", "your-password");
  params.append("client", "requestip"); // or 'referer' with referer param
  params.append("f", "json");
  params.append("expiration", "60"); // token lifetime in minutes

  try {
    const response = await fetch(tokenUrl, {
      method: "POST",
      headers: {
        "Content-Type": "application/x-www-form-urlencoded"
      },
      body: params.toString()
    });

    const json = await response.json();
    if (json.token) {
      console.log("Token generated:", json.token);
      return json.token;
    } else {
      console.error("Token generation failed:", json);
      return null;
    }
  } catch (error) {
    console.error("Error generating token:", error);
    return null;
  }
}&lt;/LI-CODE&gt;&lt;P&gt;&lt;BR /&gt;Does this help?&lt;/P&gt;</description>
      <pubDate>Tue, 13 May 2025 15:16:01 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1614111#M18921</guid>
      <dc:creator>TimWestern</dc:creator>
      <dc:date>2025-05-13T15:16:01Z</dc:date>
    </item>
    <item>
      <title>Re: Accessing User Content From ArcGIS Rest API Using Custom Widget Getting Invalid Token Error</title>
      <link>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1615068#M18989</link>
      <description>&lt;P&gt;Hi TimWestern,&lt;/P&gt;&lt;P&gt;Thank you for your response. I am sharing my code here:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;From .NET:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Controller:&lt;/P&gt;&lt;P&gt;[HttpPost("generate-arcgis-token")]&lt;BR /&gt;public async Task&amp;lt;IActionResult&amp;gt; GetToken([FromBody] UserCreds payload)&lt;BR /&gt;{&lt;BR /&gt;try&lt;BR /&gt;{&lt;BR /&gt;string pass = CryptoHelper.DecryptStringFromCryptoJS(payload.pa_encp);&lt;BR /&gt;var tokenClient = new ArcGISAccessFacade();&lt;BR /&gt;var token = await tokenClient.GetArcGISTokenAsync(payload.portal_url, payload.username, pass);&lt;BR /&gt;return Ok(token);&lt;BR /&gt;}&lt;BR /&gt;catch (Exception ex)&lt;BR /&gt;{&lt;BR /&gt;return BadRequest(new { error = ex.Message });&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;public async Task&amp;lt;TokenResponse&amp;gt; GetArcGISTokenAsync(string portal_url, string username, string password)&lt;BR /&gt;{&lt;BR /&gt;var url = portal_url + "/sharing/rest/generateToken";&lt;BR /&gt;int expirationMinutes = 60 * 24 * 7; // 7 days&lt;BR /&gt;var formData = new Dictionary&amp;lt;string, string&amp;gt;&lt;BR /&gt;{&lt;BR /&gt;{ "username", username },&lt;BR /&gt;{ "password", password },&lt;BR /&gt;{ "client", "referer" },&lt;BR /&gt;{ "referer", portal_url },&lt;BR /&gt;{ "expiration", expirationMinutes.ToString()},&lt;BR /&gt;{ "f", "json" }&lt;BR /&gt;};&lt;/P&gt;&lt;P&gt;var content = new FormUrlEncodedContent(formData);&lt;/P&gt;&lt;P&gt;var response = await httpClient.PostAsync(url, content);&lt;BR /&gt;response.EnsureSuccessStatusCode();&lt;/P&gt;&lt;P&gt;var json = await response.Content.ReadAsStringAsync();&lt;BR /&gt;var result = System.Text.Json.JsonSerializer.Deserialize&amp;lt;TokenResponse&amp;gt;(json);&lt;/P&gt;&lt;P&gt;return result;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;From ExbWidget:&lt;/STRONG&gt;&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;const&lt;/SPAN&gt; &lt;SPAN&gt;GenerateToken&lt;/SPAN&gt; &lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;async&lt;/SPAN&gt;&lt;SPAN&gt; (&lt;/SPAN&gt;&lt;SPAN&gt;portalInfo&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;iPortalInfo&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;Promise&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;iPortalToken&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt; &lt;/SPAN&gt;&lt;SPAN&gt;=&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;const&lt;/SPAN&gt; &lt;SPAN&gt;web_token_url&lt;/SPAN&gt; &lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;getConfigValue&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;(&lt;/SPAN&gt;&lt;SPAN&gt;'jps_web_api'&lt;/SPAN&gt;&lt;SPAN&gt;) &lt;/SPAN&gt;&lt;SPAN&gt;+&lt;/SPAN&gt; &lt;SPAN&gt;getConfigValue&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;(&lt;/SPAN&gt;&lt;SPAN&gt;'web_api_generate_gp_token'&lt;/SPAN&gt;&lt;SPAN&gt;) &lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;try&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;const&lt;/SPAN&gt; &lt;SPAN&gt;response&lt;/SPAN&gt; &lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;await&lt;/SPAN&gt; &lt;SPAN&gt;fetch&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;web_token_url&lt;/SPAN&gt;&lt;SPAN&gt;, {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;method&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;'POST'&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;headers&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;'Content-Type'&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;body&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;JSON&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;stringify&lt;/SPAN&gt;&lt;SPAN&gt;({&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;portal_url&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;portalInfo&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;portal_url&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;username&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;portalInfo&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;username&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;pa_encp&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;portalInfo&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;pa_encp&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;server_service_url&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;portalInfo&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;server_service_url&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;gen_token_url&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;getConfigValue&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;(&lt;/SPAN&gt;&lt;SPAN&gt;'gen_token_gp_server_url'&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (&lt;/SPAN&gt;&lt;SPAN&gt;!&lt;/SPAN&gt;&lt;SPAN&gt;response&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;ok&lt;/SPAN&gt;&lt;SPAN&gt;) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;throw&lt;/SPAN&gt; &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Error&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;`HTTP error! status: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;&lt;SPAN&gt;response&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;status&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;`&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;const&lt;/SPAN&gt; &lt;SPAN&gt;data&lt;/SPAN&gt; &lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;await&lt;/SPAN&gt; &lt;SPAN&gt;response&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;json&lt;/SPAN&gt;&lt;SPAN&gt;();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;data&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; } &lt;/SPAN&gt;&lt;SPAN&gt;catch&lt;/SPAN&gt;&lt;SPAN&gt; (&lt;/SPAN&gt;&lt;SPAN&gt;error&lt;/SPAN&gt;&lt;SPAN&gt;) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;console&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;error&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;'Error generating token:'&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;error&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;throw&lt;/SPAN&gt; &lt;SPAN&gt;error&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; }&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;};&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;const&lt;/SPAN&gt; &lt;SPAN&gt;refreshToken&lt;/SPAN&gt; &lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; (&lt;/SPAN&gt;&lt;SPAN&gt;portal_info&lt;/SPAN&gt;&lt;SPAN&gt;) &lt;/SPAN&gt;&lt;SPAN&gt;=&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;GenerateToken&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;portal_info&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/SPAN&gt;&lt;SPAN&gt;then&lt;/SPAN&gt;&lt;SPAN&gt;((&lt;/SPAN&gt;&lt;SPAN&gt;token&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;iPortalToken&lt;/SPAN&gt;&lt;SPAN&gt;) &lt;/SPAN&gt;&lt;SPAN&gt;=&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;const&lt;/SPAN&gt; &lt;SPAN&gt;tokenInfo&lt;/SPAN&gt; &lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;token&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;token&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;token&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;expires&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;token&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;expires&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;ssl&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;token&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;ssl&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;/SPAN&gt;&lt;SPAN&gt;as&lt;/SPAN&gt; &lt;SPAN&gt;iPortalToken&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;console&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;log&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;tokenInfo&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;dispatch&lt;/SPAN&gt;&lt;SPAN&gt;({&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;type&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;'setTokenInfo'&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;val&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt; &lt;SPAN&gt;tokenInfo&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/SPAN&gt;&lt;SPAN&gt;catch&lt;/SPAN&gt;&lt;SPAN&gt;((&lt;/SPAN&gt;&lt;SPAN&gt;error&lt;/SPAN&gt;&lt;SPAN&gt;) &lt;/SPAN&gt;&lt;SPAN&gt;=&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;console&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;error&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;'Error generating token:'&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;error&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; };&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;This code returns a token. If I use the token in Postman is working fine, but it does not work with the user rest API from experience builder custom widget.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Finally, what I did that worked for me:&lt;/STRONG&gt;&lt;BR /&gt;I have created a GP tool to get the token form here:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&lt;BR /&gt;gis = GIS(portal_url, username, password)&lt;BR /&gt;print(gis._con.token)&lt;BR /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;Then I call this GP tool from .NET, and this token is now able to call users rest api.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Thu, 15 May 2025 16:56:30 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1615068#M18989</guid>
      <dc:creator>sakildev1</dc:creator>
      <dc:date>2025-05-15T16:56:30Z</dc:date>
    </item>
    <item>
      <title>Re: Accessing User Content From ArcGIS Rest API Using Custom Widget Getting Invalid Token Error</title>
      <link>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1615402#M19002</link>
      <description>&lt;P&gt;So I'm not sure I quite get the architecture here.&lt;BR /&gt;&lt;BR /&gt;You have a custom widget in Experience Builder, (this is a separate web application built on top of ReactJS as a platform for multiple applications, which can then host multiple widgets custom and built-in)&lt;BR /&gt;&lt;BR /&gt;You have some .Net application that you are trying to connect?&lt;BR /&gt;&lt;BR /&gt;I'm wondering why the server would not see this other .Net Application as a different location.&amp;nbsp; The EXB app/Widget takes advantage of the user agent of the browser.&amp;nbsp; A .Net app's http call is likely going to look different. (I'm not sure what your .net application does once it has a token, but if all you need is to access the REST API to do some things in .Net I am struggling to understand why you need Experience Builder at all.)&lt;BR /&gt;&lt;BR /&gt;Perhaps put Fiddler between the .Net application and the server and see the header differences might be a clue?&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 16 May 2025 12:29:48 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1615402#M19002</guid>
      <dc:creator>TimWestern</dc:creator>
      <dc:date>2025-05-16T12:29:48Z</dc:date>
    </item>
    <item>
      <title>Re: Accessing User Content From ArcGIS Rest API Using Custom Widget Getting Invalid Token Error</title>
      <link>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1615434#M19005</link>
      <description>&lt;P&gt;Looking at this bit of code:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;public async Task&amp;lt;TokenResponse&amp;gt; GetArcGISTokenAsync(string portal_url, string username, string password)
{
var url = portal_url + "/sharing/rest/generateToken";
int expirationMinutes = 60 * 24 * 7; // 7 days
var formData = new Dictionary&amp;lt;string, string&amp;gt;
{
{ "username", username },
{ "password", password },
{ "client", "referer" },
{ "referer", portal_url },
{ "expiration", expirationMinutes.ToString()},
{ "f", "json" }
};&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It occurss to me that you are using a 'referer' based token (using the portal_url)&lt;BR /&gt;&lt;BR /&gt;Exb has some safeguards in there around that built around CORS, the Referer headers, as wella s portal trust level.&amp;nbsp; If you try to do the same with the same token from .NET you may find that won't work because the referer is going to look different.&amp;nbsp; (It might take a comparison between the request in the network tab that the widget makes vs the headers in the .net request).&lt;BR /&gt;&lt;BR /&gt;The python one runs differently, so may not have some of the same checks I believe.&lt;BR /&gt;&lt;BR /&gt;You might try using a different type instead of referrer&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;LI-CODE lang="javascript"&gt;{ "client", "requestip" }&lt;/LI-CODE&gt;&lt;P&gt;&lt;BR /&gt;Especially if the ip seen by the .net app would be the same as that seen by EXB app?&lt;BR /&gt;&lt;BR /&gt;The other option might be to register an OAuth App, setup a client_id and client_secret to generate a trusted token, and then use something server side (rather than in the code in the front end) to keep it secure when used.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 16 May 2025 13:39:14 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-experience-builder-questions/accessing-user-content-from-arcgis-rest-api-using/m-p/1615434#M19005</guid>
      <dc:creator>TimWestern</dc:creator>
      <dc:date>2025-05-16T13:39:14Z</dc:date>
    </item>
  </channel>
</rss>

