【问题标题】:How to bypass JWT authentication with Selenium?如何使用 Selenium 绕过 JWT 身份验证?
【发布时间】:2021-06-02 20:09:58
【问题描述】:

所以我正在尝试使用我的 Vue.js 作为前端对我的 Spring Boot Rest API 进行集成测试。当我想从需要 JWT 身份验证的页面中测试某些内容时,就会出现问题,但我似乎无法进入该页面。对于单元测试,我可以使用

@WithMockUser

注释,绕过身份验证的需要,进入需要的页面。

我对此很陌生。这是我到目前为止所得到的:

package com.example.SeleniumTesting;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import java.util.concurrent.TimeUnit;

public class FirstMainPageTest {
    WebDriver driver = new ChromeDriver();
    WebDriver driver2 = new ChromeDriver();
    WebDriver driver3 = new ChromeDriver();

    @BeforeTest
    public void setUp(){
        System.setProperty("webdriver.chrome.driver", ".\\chromedriver.exe");

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        driver.manage().window().maximize();
        driver.get("http://localhost:8081");


        System.setProperty("webdriver.chrome.driver", ".\\chromedriver.exe");

        driver2.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        driver2.manage().window().maximize();
        driver2.get("http://localhost:8081/parties");

        System.setProperty("webdriver.chrome.driver", ".\\chromedriver.exe");

        driver3.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        driver3.manage().window().maximize();
        driver3.get("http://localhost:8081/parties");
    }

    @Test
    public void loadHomePageTitle(){
        WebElement element = driver.findElement(By.cssSelector("h1"));
        element.isDisplayed();
    }


    @Test
    public void loadTheUnauthorizedPage(){
        WebElement element = driver2.findElement(By.cssSelector("h1"));
        element.isDisplayed();
        element.getText();
    }
    @AfterTest
    public void doThis(){
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.quit();
    }
}

我在这里也尝试过使用@WithMockUser,但这不起作用。任何人都可以帮助我如何做到这一点或指出我正确的方向(链接到显示类似问题的网站?

提前致谢!

【问题讨论】:

  • 普通用户如何进行认证?如果可能的话,你也需要使用 Selenium。如果您不进行所需的身份验证,预计您将无法访问需要身份验证的页面。
  • 身份验证机制旨在防止任何未经身份验证的用户。如果您不进行身份验证,这也会阻止 Selenium 访问。这是意料之中的,而且确实不应该有任何解决方法或绕过方法。
  • @eis 通常用户会进入登录页面并填写用户名和密码,如果凭据正确,则 jwt 令牌会存储在本地存储中。如果本地存储中有有效的 jwt 令牌,则用户可以访问此页面。那么我应该在测试中执行所有这些吗?
  • 是的,你应该这样做。您也可以在本地存储like this 中放置一个虚拟令牌,但由于例如到期应由服务器验证,因此这不应该工作 - 因此您需要执行正确的登录步骤。

标签: spring-boot vue.js jwt selenium-chromedriver integration-testing


【解决方案1】:

Selenium 测试是黑盒测试模式的一部分,因此它们的目的是从外部测试系统,而不必跳过普通用户会做的任何事情。所以我更喜欢自动化应用程序的登录部分。登录功能是您一次性编写并在所有测试中使用的功能(例如 Junit @Before)。

【讨论】:

  • 感谢您的回答,让我更清楚!
【解决方案2】:

身份验证机制旨在防止任何未经身份验证的用户。如果您不进行身份验证,这也会阻止 Selenium 访问。这是意料之中的,而且确实不应该有任何解决方法或绕过方法。

如上一个答案中所述,您应该执行普通用户会执行的所有登录步骤。您可能可以在测试之间重用登录状态,如果假设这也是真实用户会做的事情,您可以使用它。但是,重新登录会给您带来更好的测试结果和信心。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2018-05-12
    • 2016-07-21
    • 2021-08-19
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2019-04-03
    • 2018-03-03
    相关资源
    最近更新 更多