javascript
javascript copied to clipboard
HTTP 401 when Cypress chromeWebSecurity is set to false
- [x] Review the documentation: https://docs.clerk.dev/
- [x] Search for existing issues: https://github.com/clerkinc/javascript/issues
- [x] Go through package changelog files.
- [ ] Provide the Frontend API key from your application dashboard.
Package + Version
- [ ]
@clerk/clerk-js - [ ]
@clerk/clerk-react - [ ]
@clerk/nextjs - [x]
@clerk/remix - [ ]
@clerk/clerk-expo - [ ]
@clerk/backend-core - [ ]
@clerk/clerk-sdk-node - [ ]
@clerk/edge - [ ] other:
Version:
^0.1.0-alpha.6
Browser/OS
Chrome latest
Description
I have a Remix application that uses Clerk for authentication alongside Paddle for payments. Paddle is integrated via an iframe using their JavaScript library.
With Cypress, in order to avoid cross-origin errors when running E2E tests (e.g. to write an E2E test that covers a full payment flow), it is necessary to put the below within cypress.json:
{
"chromeWebSecurity": false
}
The above is necessary to allow me to access inputs, buttons, etc within the Paddle payment iframe.
The problem is that when I disable chromeWebSecurity, my app becomes unusable because Clerk starts throwing 401 Unauthorized errors. I understand that this is most likely a security feature enabled by Clerk, however it would be good if there was a way to turn this off for Clerk test/sandbox environments to facilitate testing? If it isn't possible or there isn't a workaround, then I'm also happy to take no as an answer as I understand security implications etc.
Thanks
Hello @karam94 Thanks for the report, can you please send the 401 request information ? (headers, any response etc.)
Also does this happen only by setting this option to false ? (a sandbox with a simple example would be of great help here)
Hello @karam94 Thanks for the report, can you please send the 401 request information ? (headers, any response etc.)
Also does this happen only by setting this option to false ? (a sandbox with a simple example would be of great help here)
Hi @igneel64
Will try to get you this information & an example in the next few days.
Thanks!
Hello @karam94 Thanks for the report, can you please send the 401 request information ? (headers, any response etc.)
Also does this happen only by setting this option to false ? (a sandbox with a simple example would be of great help here)
Hi @igneel64
Will update this with a sandbox example as soon as I have one available (very busy atm sorry).
It can be recreated by simply taking the remix-auth-starter, adding Cypress tests to it and modifying the cypress.json. The remix site won't work as it's wrapped by the Clerk HOC.
However, I do have an update with headers etc you requested.
So, I've upgraded @clerk/remix from ^0.1.0-alpha.6 to ^0.5.0 & this has seen a change of behaviour once I add "chromeWebSecurity": false to my cypress.json.
Instead of the 401, I now get a 400 (Bad Request).
The response body looks as below:
{
"errors": [
{
"message": "Invalid request",
"long_message": "To protect against CSRF attacks, Clerk Frontend API can only be accessed when the HTTP Origin (XHR requests) or HTTP Authorization (native application or curl requests) headers are present.",
"code": "request_header_missing"
}
]
}
I understand why this security feature is in place & as expected, but as I explained, for testing purposes it might be useful to be able to disable it. Otherwise, I simply cannot e2e test payments that rely on iframes/cross origin requests.
Same problem here. I need test a payment flow, but with chromeWebSecurity I get 401 on xhr request.
I enable some experimental features in cypress.config, then I think it's work
const { defineConfig } = require('cypress')
module.exports = defineConfig({
projectId: 'xxx',
chromeWebSecurity: true,
e2e: {
experimentalModifyObstructiveThirdPartyCode: true,
experimentalSessionAndOrigin: true,
// ...
}
})
Cypress.Commands.add('signIn', () => {
cy.log('Signing in.')
cy.visit('/sign-up')
cy.origin(process.env.CLERK_DEV_URL, () => {
cy.window().should((window) => {
expect(window).to.not.have.property('Clerk', undefined)
expect(window.Clerk.isReady()).to.eq(true)
}).then(async (window) => {
const res = await window.Clerk.client.signIn.create({
strategy: 'password',
identifier: 'xxx,
password: 'xxx'
})
await window.Clerk.setActive({
session: res.createdSessionId
})
cy.log('Finished Signing in.')
})
})
})
I enable some experimental features in cypress.config, then I think it's work
const { defineConfig } = require('cypress') module.exports = defineConfig({ projectId: 'xxx', chromeWebSecurity: true, e2e: { experimentalModifyObstructiveThirdPartyCode: true, experimentalSessionAndOrigin: true, // ... } })Cypress.Commands.add('signIn', () => { cy.log('Signing in.') cy.visit('/sign-up') cy.origin(process.env.CLERK_DEV_URL, () => { cy.window().should((window) => { expect(window).to.not.have.property('Clerk', undefined) expect(window.Clerk.isReady()).to.eq(true) }).then(async (window) => { const res = await window.Clerk.client.signIn.create({ strategy: 'password', identifier: 'xxx, password: 'xxx' }) await window.Clerk.setActive({ session: res.createdSessionId }) cy.log('Finished Signing in.') }) }) })
Thank you, I will give this a go when I can.
I enable some experimental features in cypress.config, then I think it's work
const { defineConfig } = require('cypress') module.exports = defineConfig({ projectId: 'xxx', chromeWebSecurity: true, e2e: { experimentalModifyObstructiveThirdPartyCode: true, experimentalSessionAndOrigin: true, // ... } })Cypress.Commands.add('signIn', () => { cy.log('Signing in.') cy.visit('/sign-up') cy.origin(process.env.CLERK_DEV_URL, () => { cy.window().should((window) => { expect(window).to.not.have.property('Clerk', undefined) expect(window.Clerk.isReady()).to.eq(true) }).then(async (window) => { const res = await window.Clerk.client.signIn.create({ strategy: 'password', identifier: 'xxx, password: 'xxx' }) await window.Clerk.setActive({ session: res.createdSessionId }) cy.log('Finished Signing in.') }) }) })
Your config has chromeWebSecurity set to true, you need to set it to false.
Unfortunately this did not work :/
Any other workaround would be highly appreciated.
We've just updated the instructions on how to use Clerk with Cypress. Let me know if this helps.
Thanks for the answer @SokratisVidros! I went through those instructions but unfortunately they do not help with the 400.
As soon as you put chromeWebSecurity to false, Clerk stops working. It's because the origin header is not passed anymore.
I see. The origin header is a hard requirement on our end. I will close this one for now.