programing

WordPress REST API JWT 토큰을 검증하는 동안 jwt_auth_no_auth_header 오류가 발생했습니다.

goodsources 2023. 4. 1. 09:07
반응형

WordPress REST API JWT 토큰을 검증하는 동안 jwt_auth_no_auth_header 오류가 발생했습니다.

WordPress 웹사이트용과 React 어플리케이션용 두 개의 AWS 인스턴스가 있습니다.WP REST API 접속을 위해 "WP REST API - OAuth 1.0a Server"와 "WP-API용 JWT 인증"을 사용하고 있습니다.

토큰을 생성할 수 있습니다./wp-json/jwt-auth/v1/token단, 다른 엔드포인트에 접속하려고 할 때 또는 다음 방법으로 토큰을 검증하려고 할 때/wp-json/jwt-auth/v1/token/validate다음 오류가 발생하였습니다.

{
  "code": "jwt_auth_no_auth_header",
  "message": "Authorization header not found.",
  "data": {
    "status": 403
  }
}

찾아보니 덧붙일 게 몇 가지 있더군요..htaccess찾을 수 있는 모든 것을 추가했지만 성공하지 못했습니다.

RewriteEngine On
RewriteBase /

# Enable HTTP Auth
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

# WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# For SetEnvIf Authorization
#RewriteRule (.*) - [env=myenv:1]
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
#SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

요청에 인증 헤더가 있는지 확인하기 위해 다음 코드를 추가했지만 없습니다.

add_filter( 'rest_pre_dispatch', 'prefix_show_request_headers', 10, 3 );
function prefix_show_request_headers( $result, $server, $request ) {
    $result = $request->get_headers();
    return $result;
}

여기(https://github.com/Tmeister/wp-api-jwt-auth/issues/6)에서 WordPress가 기본적으로 cookie 방식으로 인증을 시도하여 오류를 발생시키고 JWT 인증에 도달하지 못하고 있다고 읽었습니다.그래서 이 코드를 추가했지만 아직 성공하지 못했습니다.

add_filter( 'rest_authentication_errors', '__return_true' );

마지막으로 헤더에 username:password도 전송하는 "JSON Basic Authentication" 플러그인을 추가했습니다.그래서 헤더가 제거되는 것이 문제인지 잘 모르겠습니다.프로덕션 서버에는 권장되지 않기 때문에 JWT 인증이 필요합니다.

어떤 도움이라도 감사합니다.

htaccess의 행 순서를 변경할 때까지 같은 문제에 직면해 있었습니다.처음엔 선을 그었는데

RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

규칙 끝에.

Rewrite Engine On 후에만 오류 jwt_auth_no_auth_header가 수정되었습니다.wp rest api의 jwt 인증 시

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

다른 사람이 이 문제에 직면했을 경우에 대비하여 이 코드를 추가했습니다..htaccess가 작동하지 않을 수 있습니다.

# Enable HTTP Auth
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

그래서 플러그인 파일에서jwt-authentication-for-wp-rest-api/class-jwt-auth-public.php, 라는 이름의 함수를 확인합니다.validate_token, 그 후$auth체크에 실패했습니다.다음 코드를 추가했습니다.

if (!$auth) {
    $allHeaders = getallheaders();
    $auth = isset($allHeaders['Authorization']) ? $allHeaders['Authorization'] : false;
}

이거면 알 수 있어Authorization헤더와 JWT는 예상대로 동작합니다.

상기의 모든 것을 시험해, 인스톨 되고 있는 플러그 인을 체크해, 2개의 플러그 인이 있는 것을 알 수 있었습니다.하나는 「JWT Auth」, 다른 하나는 「WP-API용 JWT 인증」입니다."JWT Auth"를 비활성화 했을 때는 모든 것이 정상적으로 동작했습니다.이유는 모르겠지만 둘 사이에 무슨 갈등이 있는 것 같아요.

언급URL : https://stackoverflow.com/questions/44322866/jwt-auth-no-auth-header-error-on-validating-wordpress-rest-api-jwt-token

반응형