Bird
Raised Fist0
Cypresstesting~15 mins

Token-based authentication in Cypress - Build an Automation Script

Choose your learning style10 modes available
Verify user can login using token-based authentication
Preconditions (3)
Step 1: Send POST request to /api/login with valid username and password
Step 2: Receive authentication token in response
Step 3: Use the token to send GET request to /api/profile with Authorization header
Step 4: Verify the profile data is returned successfully
✅ Expected Result: User receives a valid token after login and can access protected profile data using the token
Automation Requirements - Cypress
Assertions Needed:
Response status code is 200 for login and profile requests
Response body of login contains a non-empty token string
Profile response contains expected user data fields
Best Practices:
Use cy.request() for API calls
Store token in alias or variable for reuse
Use assertions to check status and response body
Avoid hardcoding tokens; get dynamically from login response
Automated Solution
Cypress
describe('Token-based authentication test', () => {
  it('logs in and accesses protected profile using token', () => {
    // Step 1: Login and get token
    cy.request({
      method: 'POST',
      url: '/api/login',
      body: {
        username: 'testuser',
        password: 'TestPass123'
      }
    }).then((loginResponse) => {
      // Assert login success
      expect(loginResponse.status).to.equal(200);
      expect(loginResponse.body).to.have.property('token').and.to.be.a('string').and.not.be.empty;

      const token = loginResponse.body.token;

      // Step 2: Use token to access protected profile
      cy.request({
        method: 'GET',
        url: '/api/profile',
        headers: {
          Authorization: `Bearer ${token}`
        }
      }).then((profileResponse) => {
        // Assert profile access success
        expect(profileResponse.status).to.equal(200);
        expect(profileResponse.body).to.have.property('username', 'testuser');
        expect(profileResponse.body).to.have.property('email').and.to.be.a('string').and.not.be.empty;
      });
    });
  });
});

This test uses cy.request() to send API calls directly without UI interaction.

First, it sends a POST request to /api/login with username and password. It asserts the response status is 200 and that the response body contains a non-empty token string.

Then, it stores the token in a variable and uses it in the Authorization header to send a GET request to /api/profile. It asserts the profile response status is 200 and checks that expected user data fields like username and email are present and valid.

This approach ensures the token is dynamically retrieved and used, following best practices for token-based authentication testing.

Common Mistakes - 3 Pitfalls
Hardcoding the token value instead of retrieving it dynamically
Not asserting the response status codes
Using UI to login and then API to access profile without synchronizing token
Bonus Challenge

Now add data-driven testing with 3 different sets of valid username and password combinations to verify token-based authentication works for multiple users.

Show Hint

Practice

(1/5)
1. What is the main advantage of using token-based authentication in Cypress tests?
easy
A. It disables all API requests during testing.
B. It requires manual input of username and password every time.
C. It automatically generates UI elements for login.
D. It allows tests to log in quickly without interacting with the UI.

Solution

  1. Step 1: Understand token-based authentication purpose

    Token-based authentication lets tests bypass UI login by using tokens directly.
  2. Step 2: Compare options

    Only It allows tests to log in quickly without interacting with the UI. correctly states the advantage of faster login without UI interaction.
  3. Final Answer:

    It allows tests to log in quickly without interacting with the UI. -> Option D
  4. Quick Check:

    Token-based authentication = Fast login without UI [OK]
Hint: Token-based auth skips UI login for faster tests [OK]
Common Mistakes:
  • Thinking token auth requires UI interaction
  • Confusing token auth with disabling APIs
  • Assuming token auth auto-generates UI
2. Which Cypress command is commonly used to request an authentication token from an API?
easy
A. cy.visit()
B. cy.get()
C. cy.request()
D. cy.contains()

Solution

  1. Step 1: Identify command for API calls

    cy.request() is used to make HTTP requests to APIs, including login endpoints.
  2. Step 2: Eliminate other commands

    cy.visit() loads pages, cy.get() selects DOM elements, cy.contains() finds text; none request tokens.
  3. Final Answer:

    cy.request() -> Option C
  4. Quick Check:

    API token request = cy.request() [OK]
Hint: Use cy.request() to call APIs and get tokens [OK]
Common Mistakes:
  • Using cy.visit() to get tokens
  • Confusing cy.get() with API calls
  • Trying cy.contains() for authentication
3. Given the code below, what will be the value of token after the test runs?
let token = '';
cy.request('POST', '/api/login', { username: 'user', password: 'pass' })
  .then((response) => {
    token = response.body.token;
  });
medium
A. An empty string because token is declared outside the callback
B. The token string returned by the API in response.body.token
C. Undefined because response.body.token does not exist
D. The entire response object

Solution

  1. Step 1: Understand asynchronous assignment

    The token variable is assigned inside the .then() callback after the API response arrives.
  2. Step 2: Confirm token value after request

    response.body.token contains the token string from the API, so token gets that value.
  3. Final Answer:

    The token string returned by the API in response.body.token -> Option B
  4. Quick Check:

    token = response.body.token string [OK]
Hint: Token is set inside .then() from response.body.token [OK]
Common Mistakes:
  • Assuming token stays empty due to async
  • Thinking token is undefined without checking API
  • Confusing token with full response object
4. Identify the error in this Cypress test snippet for token-based login:
cy.request('POST', '/api/login', { username: 'user', password: 'pass' })
  .then((response) => {
    cy.setCookie('authToken', response.token);
  });
medium
A. response.token should be response.body.token to access the token
B. cy.setCookie is not a valid Cypress command
C. The request method should be GET, not POST
D. Cookies cannot store authentication tokens

Solution

  1. Step 1: Check response object structure

    The token is usually inside response.body.token, not directly response.token.
  2. Step 2: Validate cy.setCookie usage

    cy.setCookie is a valid command to set cookies in Cypress.
  3. Final Answer:

    response.token should be response.body.token to access the token -> Option A
  4. Quick Check:

    Access token via response.body.token [OK]
Hint: Use response.body.token, not response.token [OK]
Common Mistakes:
  • Using response.token instead of response.body.token
  • Thinking cy.setCookie is invalid
  • Changing POST to GET incorrectly
5. You want to write a Cypress test that logs in using token-based authentication and then visits a protected page. Which sequence correctly achieves this?
A) cy.request('POST', '/api/login', {username: 'user', password: 'pass'}).then(res => {
  cy.setCookie('token', res.token);
});
cy.visit('/protected');

B) cy.visit('/protected');
cy.request('POST', '/api/login', {username: 'user', password: 'pass'}).then(res => {
  cy.setCookie('token', res.body.token);
});

C) cy.request('POST', '/api/login', {username: 'user', password: 'pass'}).then(res => {
  cy.setCookie('token', res.body.token);
  cy.visit('/protected');
});

D) cy.setCookie('token', 'dummy');
cy.visit('/protected');
hard
A. Set dummy token cookie, then visit protected page
B. Visit protected page first, then request token and set cookie
C. Request token, set cookie, then visit protected page outside .then()
D. Request token, set cookie, then visit protected page inside .then() callback

Solution

  1. Step 1: Understand asynchronous flow

    Token must be set before visiting the protected page, so visit must happen after setting cookie inside .then().
  2. Step 2: Analyze options

    Request token, set cookie, then visit protected page inside .then() callback sets cookie and visits page inside .then(), ensuring correct order and token availability.
  3. Final Answer:

    Request token, set cookie, then visit protected page inside .then() callback -> Option A
  4. Quick Check:

    Set token cookie before visiting page inside .then() [OK]
Hint: Visit protected page only after setting token cookie inside .then() [OK]
Common Mistakes:
  • Visiting page before setting token cookie
  • Setting cookie outside async callback
  • Using dummy tokens without real login
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard