Spring oauth2和集成测试

时间:2017-08-30 13:22:40

标签: spring-boot oauth-2.0 integration-testing rest-assured

需要有关Oauth2客户端集成测试的帮助。

设定:

  • 客户端,包含受保护的用户界面和API
  • 身份验证服务器全部 完成密码验证并检索访问令牌

整合测试:

  • 用于终点测试的放心使用
  • 在实施Oauth2测试之前工作正常

Ole测试示例:

        given().auth()
           .preemptive()
           .basic(USER_EMAIL,PASSWORD) <-- this not valid any more
           .contentType(ContentType.JSON)
           .when()
           .pathParam("id","123")
           .delete(PROFILE_FIELD_BASE_URL)
           .andReturn()
           .body();

问题:

  • 我怎么能让这个测试再次起作用?
  • 如何更改可靠的设置以支持oauth2?
  • 我是否需要模拟身份验证服务器,还是可以注入/模拟安全上下文?

1 个答案:

答案 0 :(得分:1)

您展示的代码仅用于基本身份验证,并且对于使用OAuth的保证,通常,您必须更改该代码。从REST Assured github page您可以看到以下两个问题:

    @Test public void
oauth2_works_with_preemptive_header_signing() {
    final String accessToken = "accessToken";

    given().
            auth().preemptive().oauth2(accessToken).
            filter(new Filter() {
                public Response filter(FilterableRequestSpecification requestSpec, FilterableResponseSpecification responseSpec, FilterContext ctx) {
                    assertThat(requestSpec.getHeaders().getValue("Authorization"), equalTo("Bearer "+accessToken));
                    return new ResponseBuilder().setBody("ok").setStatusCode(200).build();
                }
            }).
    when().
            get("/somewhere").
    then().
            statusCode(200);
}

@Test public void
oauth2_works_with_non_preemptive_header_signing() {
    final String accessToken = "accessToken";

    given().
            auth().oauth2(accessToken).
            filter(new Filter() {
                public Response filter(FilterableRequestSpecification requestSpec, FilterableResponseSpecification responseSpec, FilterContext ctx) {
                    AuthenticationScheme scheme = requestSpec.getAuthenticationScheme();
                    assertThat(scheme, instanceOf(PreemptiveOAuth2HeaderScheme.class));
                    assertThat(((PreemptiveOAuth2HeaderScheme) scheme).getAccessToken(), equalTo(accessToken));
                    return new ResponseBuilder().setBody("ok").setStatusCode(200).build();
                }
            }).
    when().
            get("/somewhere").
    then().
            statusCode(200);
}

作为另一个示例,您可以查看here