Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Websocket Authentication issues #555

Open
clwillingham opened this issue Oct 10, 2023 · 0 comments
Open

Websocket Authentication issues #555

clwillingham opened this issue Oct 10, 2023 · 0 comments
Labels

Comments

@clwillingham
Copy link
Contributor

clwillingham commented Oct 10, 2023

Environment


  • Operating System: Linux
  • Node Version: v16.17.1
  • Nuxt Version: 3.7.4
  • CLI Version: 3.9.0
  • Nitro Version: 2.6.3
  • Package Manager: bun@1.0.4
  • Builder: -
  • User Config: css, devtools, modules, apollo
  • Runtime Modules: @nuxtjs/apollo@5.0.0-alpha.7
  • Build Modules: -

(actually using bun which for the most part has been working, but I have tested through node as well)

Describe the bug

In the current implementation of the Nuxt 3 Apollo module, websocket authentication does not work effectively against Hasura. Hasura expects the headers, including the authorization headers, to be embedded within a headers key in the initial connection_init message. However, the Apollo module configures the websocket link to include the authorization key at the root of the payload key. This discrepancy leads to an authentication failure.

Actual Behavior

The authorization key is being sent at the root payload key, leading to an error with Hasura. The actual payload structure is:

{
  "type": "connection_init",
  "payload": {
    "Authorization": "Bearer ..."
  }
}

Expected behaviour

The authorization headers should be encapsulated within a headers key to be compatible with Hasura’s expected payload structure. For example:

{
  "type": "connection_init",
  "payload": {
    "headers": {
      "content-type": "application/json",
      "Authorization": "Bearer ..."
    }
  }
}

Reproduction

  1. Set up a Nuxt 3 project with Apollo and configure it to use websocket for subscriptions.
  2. Integrate with a Hasura GraphQL endpoint that requires authentication.
  3. Use the onLogin method to set the Bearer token for authentication.
  4. Watch sadly as your subscription requests are rejected and Hasura gaslights you by telling you that it doesn't know what your looking for (as is expected when your not authorized to access a resource in Hasura)

Additional context

My fork with my own solution is available here: https://github.com/clwillingham/apollo
the fix was simple, I just wrapped the Auth header: v5...clwillingham:apollo:v5

Suggested Solutions:

  1. Expose connectionParams in the configuration, making the websocket link configurable to accommodate various payload structures.
  2. Introduce a boolean setting to toggle the placement of authorization headers, either at the root of the payload or within a headers key.
  3. Set the authorization headers within the headers key by default, if that is a universal expectation across GraphQL servers.

Enhancing the configurability of connectionParams would cater not only to this specific issue but also provide flexibility for developers to customize the connection_init message as per their requirements, for example, sending the Hasura admin key during early sandbox development.

Logs

No response

@clwillingham clwillingham changed the title Authentication with Hasura websocket connection does not work Websocket Authentication issues Nov 30, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant