gpt4 book ai didi

java - OKTA 多重身份验证 + Java + RestAssured :/login/step-up/redirect always returns 403 through RESTAssured

转载 作者:行者123 更新时间:2023-12-01 16:45:39 29 4
gpt4 key购买 nike

我正在尝试使用 Java 的 RestAssured API 进行 OKTA 身份验证。有问题的身份验证类型是多因素的,虽然我总是能够在 Google Chrome 中成功进行此身份验证,但在 RestAssured 中它始终失败,并显示 403,尽管匹配了所有请求 header 和 cookie。我的最终目标是获取不记名身份验证 token ,以便能够在登录后运行服务。

本质上,这是我调用的服务序列:

1) [已编辑]/api/v1/authn;我提供我的用户名和密码,以及一些字母数字状态 token 。 (我在 RestAssured 的 RequestSpecification 周围使用包装类:)这会成功返回 200:

            // Create a brand new request to login using OKTA.
RequestWrapper requestWrapper11 = new RequestWrapper();
requestWrapper11.setResponseContentType(ContentType.JSON);
requestWrapper11.setAcceptedContentType(ContentType.JSON);
requestWrapper11.setHTTPMethod(Method.POST);

requestWrapper11.setRequestPayload(new HashMap<>() {
{
put("username", "[redacted]");
put("password", "[redacted]");
put("options", new HashMap<String, Object>() {
{ put("warnBeforePasswordExpired", true); }
{ put("multiOptionalFactorEnroll", true); }
});
}
});

// Authenticate and get a brand new state token.
requestWrapper11.setBaseURL(new URL("[redacted]/api/v1/authn"));
ResponseWrapper response = requestWrapper11.executeAndGetResponse();

通过此服务调用,我得到了下一步使用的状态 token 以及因子 ID。

2) 然后,我调用 POST 服务 [redacted]/api/v1/authn/factors 并提供安全问题的答案:(这也会成功返回 200):

{answer:“[redacted_1]”,stateToken:“[state_token]”}

     RequestWrapper requestWrapper2 = new RequestWrapper();
requestWrapper2.setResponseContentType(ContentType.JSON);
requestWrapper2.setAcceptedContentType(ContentType.JSON);
requestWrapper2.setHTTPMethod(Method.POST);

requestWrapper2.setRequestPayload(new HashMap<>() {
{
put("answer", "[redacted]");
put("stateToken", stateToken);
}
});
requestWrapper2.setOverrideQueryParams(new HashMap<>() {
{ put("rememberDevice", false); }
});

// Authenticate and get a brand new state token.
requestWrapper2.setBaseURL(new URL("[redacted]/api/v1/authn/factors/" + factorId + "/verify"));

3) 最后,我进行 GET 调用 [redacted]/login/step-up/redirect?stateToken=[state_token] 以返回用于身份验证目的的特殊代码。

        RequestWrapper requestWrapper4 = new RequestWrapper();
// requestWrapper4.setAllowRedirects(true);
requestWrapper4.setOverrideQueryParams(new HashMap<>() {
{put("stateToken",stateToken); }
});
requestWrapper4.setHeader("Connection", "Keep-Alive");
requestWrapper4.setHeader("Host", "[redacted]");
requestWrapper4.setHeader("Accept", "text/html,application/xhtml+xml,application/xml" +
";q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
requestWrapper4.setHeader("Accept-Encoding", "gzip, deflate, br");
requestWrapper4.setHeader("Accept-Language", "en-US,en;q=0.9");
requestWrapper4.setHeader("Sec-Fetch-Dest","document");
requestWrapper4.setHeader("Sec-Fetch-Mode", "navigate");
requestWrapper4.setHeader("Sec-Fetch-Site", "same-origin");
requestWrapper4.addCookies(responseWrapper2.cookies);
requestWrapper4.addCookie("oktaStateToken", stateToken);
requestWrapper4.addCookie("t", "summer");
requestWrapper4.addCookie("DT", "DI0--aZ4ipPS8mFXhEWHFwXUw");
requestWrapper4.addCookie("ADRUM_BTa", "R:0|g:dd262b5c-ae86-4a1d-86aa-a89b3fed2bed|n:Okta_6d5b1e30-d05a-4894-a37b-81b5f6c60e0e");
requestWrapper4.addCookie("ADRUM_BT1", "R:0|i:617|e:41");
requestWrapper4.setHTTPMethod(Method.GET);
requestWrapper4.setHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36");
requestWrapper4.setBaseURL(new URL("[redacted]/login/step-up/redirect"));
ResponseWrapper responseWrapper4 = requestWrapper4.executeAndGetResponse();

当我正常使用浏览器进行身份验证时,这三个服务调用在浏览器中毫无问题地进行,并且全部返回 200 或 302。但是,每当我使用 RestAssured API 运行这些服务时,我总是在第三个服务上收到 403无论作为查询参数 {stateToken} 传入的 token 是否合法,都会执行。当这个参数不是通过 RestAssured API 传入时,我总是得到 400,所以我知道这个方法调用区分是否传入了状态 token 。

我的问题是:上面的一组步骤中是否遗漏了任何值得注意的内容,导致 403 始终通过一种媒体返回,而不是通过网络浏览器返回?是否存在阻止使用 RestAssured API 进行身份验证的措施?如果是这样,我是否可以采取其他路线来获取不记名 token ?

最佳答案

我想到了一些事情。

1.) 您的回复是否包含回复 #2 中的升级链接? https://developer.okta.com/docs/reference/api/authn/#response-example-after-authentication-and-mfa-are-complete-for-step-up-authentication-with-okta-session

2.) 如果可能,我建议使用 OAuth 流程(或 SAML),而不是使用 Authn API

3.) Authn API 是一个状态机,您不能总是假设您可以按该顺序执行这些请求。

Okta 还有一个 Authn SDK:https://github.com/okta/okta-auth-java (但同样,我们建议尽可能使用 OAuth)

关于java - OKTA 多重身份验证 + Java + RestAssured :/login/step-up/redirect always returns 403 through RESTAssured,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61783815/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com