Proxy error: UnprocessableEntity, Failed to get installation and oauth information for app | The place for Zendesk users to come together and share
Skip to main content
January 20, 2022
Question

Proxy error: UnprocessableEntity, Failed to get installation and oauth information for app

  • January 20, 2022
  • 48 replies
  • 177 views

I have been guided here by Zendesk support, I am receiving the error Proxy error: {:code=>"UnprocessableEntity", :status=>"422", :title=>"Unprocessable Entity", :message=>"Failed to get installation and oauth information for app."} when I attempt to create a request to a 3rd party server, I have followed your extensive guide but still recieving the above.

48 replies

March 11, 2025
{
  "_warning": "AUTOMATICALLY GENERATED FROM $/src/manifest.json - DO NOT MODIFY THIS FILE DIRECTLY",
  "name": "...",
  "author": {
    "name": "...",
    "email": "...",
    "url": "..."
  },
  "defaultLocale": "en",
  "private": true,
  "location": {
    "support": {
      "ticket_sidebar": {
        "url": "assets/index.html",
        "flexible": true
      }
    }
  },
  "parameters": [
    {
      "name": "token",
      "type": "oauth"
    }
  ],
  "oauth": {
    "client_id": "0...K",
    "client_secret": "r...f",
    "authorize_uri": "https:....eu.auth0.com/oauth/authorize",
    "access_token_uri": "https:....eu.auth0.com/oauth/token",
    "scope": "openid profile email",
    "secure": "true"
  },
  "version": "1.0",
  "frameworkVersion": "2.0"
}

 const fetchData = async () => {
    try {
      setLoading(true);
      const data = await client.request(buildRequest(url));
      setData(data);
      setError(null);
    } catch (error) {
      setError(error);
    } finally {
      setLoading(false);
    }
  }
  
  const buildRequest = (url) => ({
  url: `${import.meta.env.VITE_API_URL}/api/${url}`,
  type: "GET",
  headers: {
    Authorization: `Bearer ${import.meta.env.VITE_JWT_TOKEN}`,
  },
  contentType: "application/json",
  secure: import.meta.env.VITE_SECURE_OAUTH === 'true',
});
Greg K
Employee
March 11, 2025
Thanks for that Andy! I'm not seeing where you're using the OAuth token in this request...the Auth headers are referencing a JWT, not the OAuth token that you defined. So I think the issue here is that your JWT is expiring and the OAuth token is never being used. Could you update the request to use "Bearer {{setting.token}}" instead? 
 
Also, not sure if this will matter, but I don't believe you need to specify the oauth object as secure itself, you just need to set that in the request. Let me know if this resolves it all for you.
March 12, 2025

Hi, I will remove the secure prop - to support local dev the ${import.meta.env.VITE_JWT_TOKEN} is compiled to Bearer {{setting.token}} when in prod and is substituted with an actual token locally.  As I say, the app works fine the first time it is installed (so the token is correctly substituted for at least some of the time).

March 13, 2025

Just as a follow up - this is a chunk of the minified code showing the placeholder being inserted.

{Authorization:"Bearer {{setting.token}}"},contentType:"application/json",secure:!0}),g=(s,t)=>{const[a,r]=x.useState(!0),[l,c]=x.useState(null),[n,i]=x.useState(null);x.useEffect(()=>{d()},[s]);const d=async()=>{try{r(!0);const o=await t.request(v(s));i(o),c(null)}catch(o){o.status===401?c("Please ask a Zendesk administrator to re-authenticate with Auth0"):
March 13, 2025

I have tried setting the secure property to false within the Oauth property - as expected this fails with invalid token as the substitution is not made.

Employee
March 21, 2025
Hi Andy,
 
I'm Chris from our Developer Support team, stepping in to assist while Greg is unavailable.  I took a look at the details you shared and as a next step I'd like to review some logging of a request attempt.  To help with this, can you reproduce the proxy error again and let me know the timestamp of the attempt?
 
Best,
 
Chris Kennedy | Developer Advocate
March 24, 2025

Hi - I have successfully authenticated using the bearer token at 2025-03-24T11:12:00, I will wait until the token expires and let you know the timestamp when I get the failure message. Kind regards Andy

March 24, 2025

Hi, at 2025-03-24T15:54:22 the API returned Proxy error: {:code=>"UnprocessableEntity", :status=>"422", :title=>"Unprocessable Entity", :message=>"Failed to get installation and oauth information for app."} when hitting https://problemsharedengineeringhelp.zendesk.com/proxy/v2/apps/secure
 

March 25, 2025

I was able to authenticate upon initial load/install of the app but I don't have any way to see logs when it goes for refresh token.
This worked successfully 5 hours ago. and when i came back to it I am getting this error. so I am assuming the refresh token failed, the expires_in key is in the response from the token endpoint.  
Please see link below

https://app.ninjarmm.com/apidocs-beta/authorization/flows/authorization-code-flow
 
ZAF client Support App Function:

async function getDevices() {

  if (!token) {

    console.log("Failed to obtain access token");

    return;

  }

  try {

    return await client.request({

      url: "https://app.ninjarmm.com/api/v2/devices-detailed",

      type: "GET",

      headers: { Authorization: "Bearer {{setting.token}}" },

      secure: true,

    });

  } catch (error) {

    console.error("Error fetching devices:", error);

  }

}

Manifest portion regarding oauth:
  "parameters": [

    {

      "name": "token",

      "type": "oauth"

    }

  ],

  "oauth": {

    "response_type": "code",

    "client_id": "************************",

    "client_secret": "**********************************",

    "authorize_uri": "https://app.ninjarmm.com/ws/oauth/authorize",

    "scope": "control monitoring management",

    "access_token_uri": "https://app.ninjarmm.com/ws/oauth/token"

  },

Employee
March 26, 2025
Hello,
 
Thanks for the info.  In our logs I can see that our OAuth connection service fails to refresh because it did not receive a refresh token from NinjaOne on the initial authorization.  To allow a refresh token to be returned, can you please include an offline_access scope in the app's manifest?  NinjaOne's docs note that this scope is required for them to return a refresh token.
 
Best,
 
Chris Kennedy | Developer Advocate