programing

브라우저가 Jquery를 사용하여 기본 인증 팝업을 호출하고 401 오류를 처리하는 것을 방지하는 방법은 무엇입니까?

iphone6s 2023. 8. 5. 09:58
반응형

브라우저가 Jquery를 사용하여 기본 인증 팝업을 호출하고 401 오류를 처리하는 것을 방지하는 방법은 무엇입니까?

기본 인증을 사용하여 승인 요청을 보내야 합니다.저는 jquery를 사용하여 성공적으로 구현했습니다.그러나 401 오류가 발생하면 기본 인증 브라우저 팝업이 열리고 jquery ajax 오류 콜백이 호출되지 않습니다.

저도 최근에 이 문제에 직면했습니다.이 경우 팝업을 표시하는 브라우저의 기본 동작을 변경할 수 없기 때문에401(기본 또는 다이제스트 인증), 이 문제를 해결하는 두 가지 방법이 있습니다.

  • 서버 응답을 반환하지 않도록 변경합니다.401반환 a200대신 코드를 작성하고 jQuery 클라이언트에서 처리합니다.
  • 인증에 사용하는 방법을 헤더의 사용자 지정 값으로 변경합니다.브라우저에 기본요약 팝업이 표시됩니다.클라이언트와 서버 모두에서 이 설정을 변경해야 합니다.

    headers : {
      "Authorization" : "BasicCustom"
    }
    

JQuery를 Basic Auth와 함께 사용하는 예도 확인하십시오.

일반 400 상태 코드를 반환한 다음 해당 클라이언트 측을 처리합니다.

또는 401을 유지하고 WWW-Authenticate 헤더를 반환하지 않을 수 있습니다. 이는 브라우저가 인증 팝업으로 응답하는 것과 같습니다.WWW-Authenticate 헤더가 없으면 브라우저에서 자격 증명을 묻는 메시지가 표시되지 않습니다.

다른 사람들이 지적했듯이, 브라우저의 동작을 변경하는 유일한 방법은 응답에 401 상태 코드가 포함되어 있지 않은지 확인하거나 포함되어 있으면 포함되어 있지 않은지 확인하는 것입니다.WWW-Authenticate: Basic표제의상태 코드를 변경하는 것은 매우 의미적이고 바람직하지 않으므로, 좋은 접근법은 다음을 제거하는 것입니다.WWW-Authenticate표제의웹 서버 응용프로그램을 수정할 수 없거나 수정하지 않으려면 Apache를 통해 항상 서비스하거나 프록시를 사용할 수 있습니다(Apache를 아직 사용하지 않는 경우).

다음은 Apache가 응답을 다시 작성하여 WWW-Authenticate 헤더 IFF 요청에 헤더가 포함되어 있습니다.X-Requested-With: XMLHttpRequest(JQuery/AngularJS 등과 같은 주요 Javascript 프레임워크에 의해 기본적으로 설정됨) 그리고 응답은 헤더를 포함합니다.WWW-Authenticate: Basic.

Apache 2.4에서 테스트됨(2.2에서 작동하는지 확실하지 않음).이는 다음에 의존합니다.mod_headers설치 중인 모듈입니다. (데비안/우분투에서,sudo a2enmod headersApache(아파치)

    <Location />
            # Make sure that if it is an XHR request,
            # we don't send back basic authentication header.
            # This is to prevent the browser from displaying a basic auth login dialog.
            Header unset WWW-Authenticate "expr=req('X-Requested-With') == 'XMLHttpRequest' && resp('WWW-Authenticate') =~ /^Basic/"
    </Location>   

다음과 같은 요청 URL을 사용하여 기본 인증 팝업을 표시하지 않을 수 있습니다.

https://username:password@example.com/admin/...

401 오류(잘못된 사용자 이름 또는 암호)가 발생하면 jquery 오류 콜백으로 올바르게 처리됩니다.일부 보안 문제(https 대신 http 프로토콜의 경우)가 발생할 수 있지만 작동합니다.

업데이트: 이 솔루션 지원은 Chrome 59에서 제거됩니다.

요청 헤더에 X-Requested-With: XMLHttpRequest를 사용합니다.따라서 응답 헤더에 WWW-Authenticate:기본의.

beforeSend: function (xhr) {
                    xhr.setRequestHeader('Authorization', ("Basic "
                        .concat(btoa(key))));
                    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                },

URL 을 설정하여 IIS 을 다시 작성할 수 .WWW-Authentication을 로는향으로 .None요청한 URL에 있습니다.

여기로 안내해 주세요.

하고자 하는 은 변하경려값다같습니다과음은입니다.response_www_authenticate.

더 필요한 정보가 있으면 댓글을 달아주시면 web.config 파일을 올리겠습니다.

WWW-Authenticate 헤더가 제거되면 자격 증명의 캐싱을 얻지 못하고 요청에 따라 Authorization 헤더를 반환하지 못합니다.즉, 이제 생성하는 모든 새 요청에 대한 자격 증명을 입력해야 합니다.

수정 이유나 범위를 조사하지는 않았지만, 내가 하고 있는지 알아냈습니다.fetch " " " 를 합니다.x-requested-with: 'XMLHttpRequest'나는 더 이상 Chrome에서 팝업 인증 상자를 받지 않고 서버를 변경할 필요가 없습니다.노드와 대화하고 있습니다.http도서관.처럼 보인다WWW-Authenticate헤더는 서버에서 돌아오지만 Chrome은 다르게 처리합니다.아마 사양했을 겁니다.

예:

fetch(url, {
  headers: {
     Authorization: `Basic ${auth}`,
     'x-requested-with': 'XMLHttpRequest'
  },
  credentials: 'include'
})

또는 서버 응답을 사용자 정의할 수 있는 경우 403 금지됨을 반환할 수 있습니다.

브라우저가 인증 팝업을 열지 않고 jquery 콜백이 호출됩니다.

Safari에서는 동기식 요청을 사용하여 브라우저가 팝업을 표시하지 않도록 할 수 있습니다.물론 동기식 요청은 이 경우에만 사용자 자격 증명을 확인하는 데 사용해야 합니다.실제 요청을 보내기 전에 이러한 요청을 사용할 수 있으며, 내용(보냈거나 받은 내용)이 상당히 많은 경우 사용자 환경이 좋지 않을 수 있습니다.

    var xmlhttp=new XMLHttpRequest;
    xmlhttp.withCredentials=true;
    xmlhttp.open("POST",<YOUR UR>,false,username,password);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

GET를 통해 "user" 및 "password" 매개 변수를 수락하고 기본 인증이 필요하지 않도록 /login URL을 만듭니다.여기서 php, node, java 등을 사용하여 암호 파일을 구문 분석하고 매개 변수(사용자/패스)를 일치시킵니다.일치하는 항목이 있으면 http://user:pass@domain.com /(브라우저에 자격 증명이 설정됨)로 리디렉션하고 일치하지 않으면 401 응답을 보냅니다(WWW-Authenticate 헤더 없음).

Spring Boot와 함께 뒷면부터 맞춤형 Basic Authentication EntryPoint를 사용자 지정 Basic Authentication EntryPoint:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and().authorizeRequests()
            ...
            .antMatchers(PUBLIC_AUTH).permitAll()
            .and().httpBasic()
//    https://www.baeldung.com/spring-security-basic-authentication
            .authenticationEntryPoint(authBasicAuthenticationEntryPoint())
            ...

@Bean
public BasicAuthenticationEntryPoint authBasicAuthenticationEntryPoint() {
    return new BasicAuthenticationEntryPoint() {
        {
            setRealmName("pirsApp");
        }

        @Override
        public void commence
                (HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
                throws IOException, ServletException {
            if (request.getRequestURI().equals(PUBLIC_AUTH)) {
                response.sendError(HttpStatus.PRECONDITION_FAILED.value(), "Wrong credentials");
            } else {
                super.commence(request, response, authEx);
            }
        }
    };
}

언급URL : https://stackoverflow.com/questions/9859627/how-to-prevent-browser-to-invoke-basic-auth-popup-and-handle-401-error-using-jqu

반응형