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
  • 176 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

Erica
Employee
July 21, 2022
Hi Stuart,
 
If you're able to provide a link to the repo or code snippets that would be helpful for us to dig into it. It would also be greatly appreciated if you could provide context around when this error first began. Has it always been unsuccessful or have any known changes been made prior to it occurring? 
 
Looking forward to your response!
 
Best,
 
Erica
Ismail13
November 18, 2022

Hello,

I'm experiencing this issue in a Zendesk support app where I need to use a third-party API requiring HTTP Basic authentication. The issue is so far only locally and I've not yet tried to install the app. The following is code that makes the request:

    const metadata = await client.metadata();
  const apiUrl = metadata.settings.apiUrl;
  const settings = {
      url: 'https://' + apiUrl + '/' + path + (queryParams ? '?' + queryParams : ''),
      secure: true,
      cors: false,
      type: 'GET',
      dataType: 'json',
      contentType: 'application/json',
      headers: {
          Authorization: 'Basic {{setting.apiToken}}',
      },
      accepts: "application/json",
    };

  return client.request(settings)
      .then(successHandler)
        .catch(handleFailure);

And this is how my `menifet.json` look like:

{
  "name": "...",
  "author": {
      "name": "...",
      "email": "...",
      "url": "..."
  },
  "defaultLocale": "da",
  "private": true,
  "location": {
      "support": {
          "nav_bar": "assets/index.html"
      }
  },
  "version": "0.9.12",
  "frameworkVersion": "2.0",
  "domainWhitelist": ["{{setting.apiUrl}}"],
  "parameters": [
      {
          "name": "apiUrl",
          "type": "url",
          "required": true,
          "secure": false,
          "default": "..."
      },
      {
          "name": "apiToken",
          "type": "password",
          "required": true,
          "secure": true,
          "default": "..."
      }
  ]
}
This is not a new app. I'm changing the API endpoints in an existing app.
 
Best regards,
Ismail
Ismail13
November 18, 2022

Thank you for your answer @ahmed11. That is very unfortunate. Do you know whether there is a way to find out whether the app is running locally? Knowing so will allow me to make an "insecure" request locally and use secure settings when it is not local.

Ismail13
November 18, 2022

For anyone having this issue. The following is working both locally and when installed:

    const metadata = await client.metadata();
  const apiUrl = metadata.settings.apiUrl;
  const settings = {
      url: 'https://' + apiUrl + '/' + path + (queryParams ? '?' + queryParams : ''),
      secure: !!metadata.installationId,
      cors: false,
      type: 'GET',
      dataType: 'json',
      contentType: 'application/json',
      headers: {
          Authorization: `Basic ${ !!metadata.installationId ? '{{setting.apiToken}}' : metadata.settings.apiToken }`,
      },
      accepts: "application/json",
  };
  return client.request(settings)
      .then(successHandler)
        .catch(handleFailure);

The `installationId` will be `0` when the app is running locally.

 

Sal
November 18, 2022

I was really hoping this would work. But when I fetch client.metadata I get a uuid installationId when I run locally

So based on further testing and investigating,

when local - the value is a string

when installed - the value is a number

so we can use a typeof check to work out if we are running locally or installed.

Ismail13
November 18, 2022

Very interesting @sal. Are you using zat or zcli? I'm using zat and here the installationId is 0 locally.

Will31
November 30, 2022

Hi I'm having a lot of problems with this too. In my manifest I have:

```

{

 "parameters": [
    {
      "name": "token",
      "type": "oauth"
    }
  ],
  "oauth": {
    "client_id": "XXX",
    "client_secret": "XXX",
    "authorize_uri": "https://XXX/oauth2/authorize",
    "access_token_uri": "https://XXX/oauth2/token",
    "scope": "email profile offline_access"
  }

}

```

and my code does

```

client.request({
  url: 'https://xxx.com/some/endpoint',
  type: 'GET',
  secure: true,
  headers: {Authorization: 'Bearer {{setting.token}}'},
})

```

The app seems to authorise fine when I go through the process but I still get this proxy error.

One detail is that I've installed the app in a zendesk sandbox to test it. Is this expected to work?

Sal
November 30, 2022

@Ismail - I am using ZCLI.

@Will I think you are missing secure: true for the parameter in the manifest file

Will31
December 1, 2022

If I set that I get

Uploading app... Uploaded
Deploying app... Failed
 ›   Error: Error: oauth parameter cannot be set to be secure.
Eric27
December 5, 2022

Hey Will,

You mind if we pull this into a ticket so that you can share a zip of your app for us to take a look at?

Thanks!