从 localhost 到 rest api 的身份验证结果 CORS 错误

Posted

技术标签:

【中文标题】从 localhost 到 rest api 的身份验证结果 CORS 错误【英文标题】:Authentication from localhost to rest api results CORS error 【发布时间】:2017-07-04 09:02:06 【问题描述】:

我刚刚在dev server 上安装了一个新的 wp。我正在尝试使用位于我的计算机/设备上的 ionic/angularjs 应用程序对其余 api(插件,因为它是 wp v.4.6.3)进行身份验证。目前使用JWT Authentication for WP-API 插件。 这是我的标头,在 HTTP 标头插件的帮助下:

content-encoding: gzip
x-powered-by: php/5.5.9-1ubuntu4.21
connection: keep-alive
content-length: 3361
keep-alive: timeout=5, max=95
access-control-allow-headers: accept, authorization, cache-control, cookie, content-type, origin
server: apache/2.4.7 (ubuntu)
x-frame-options: allow-from *
vary: accept-encoding
access-control-allow-methods: get, post, options, head, put, delete, trace, connect, patch
content-type: text/html; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: cache-control, cookie, content-type, origin
cache-control: no-cache, must-revalidate, max-age=0

无论我做什么,我都会遇到一些 CORS 错误。最近的是:

请求标头字段 Content-Type 不允许 预检响应中的 Access-Control-Allow-Headers。

JWT 插件在文档中也提到了编辑 .htaccess 和 wp-config.php,我这样做了。尝试了 htacces 编辑和/或插件的几种组合。但是会弹出相同或类似的错误。

这是我的代码,基于 JWT 插件的文档(凭证/url 有效!):

var apiHost = 'http://dev.imok.ro/authworks/wp-json';
$http.post( apiHost + '/jwt-auth/v1/token', 
   username: 'admin',
   password: 'admin!@#'
)
.then( function( response ) 
   console.log( 'siker', response.data )
)
.catch( function( error ) 
   console.error( 'Errorrrr', error );
);

.htaccess:

#<ifModule mod_headers.c>
#    Header always set Access-Control-Allow-Origin: *
##    Header always set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS"
##    Header always set Access-Control-Allow-Headers "content-type"
#</ifModule>

<IfModule mod_rewrite.c>

#SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

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

RewriteEngine On
RewriteBase /authworks/
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /authworks/index.php [L]
</IfModule>

感谢您的帮助! 马戈尔

【问题讨论】:

对我来说同样的问题 【参考方案1】:

您可以通过编辑 public/class-jwt-auth-public.php 来解决这个问题

public function add_cors_support()

    $enable_cors = defined('JWT_AUTH_CORS_ENABLE') ? JWT_AUTH_CORS_ENABLE : false;
    if ($enable_cors) 
        remove_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' );
        add_filter( 'rest_pre_serve_request', function( $value ) 
            header( 'Access-Control-Allow-Origin: *' );
            header( 'Access-Control-Allow-Methods: GET, POST, UPDATE, DELETE' );
            header( 'Access-Control-Allow-Headers: Authorization, Content-Type' );
            header( 'Access-Control-Allow-Credentials: true' );
            return $value;
        );

        // $headers = apply_filters('jwt_auth_cors_allow_headers', 'Access-Control-Allow-Headers, Content-Type, Authorization');
        // header(sprintf('Access-Control-Allow-Headers: %s', $headers));
    

我已经提交了PR

【讨论】:

我不幸运,它不工作

以上是关于从 localhost 到 rest api 的身份验证结果 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

在spring boot应用程序中从自己的rest api调用另一个rest api

使用 Axios 从前端访问 Django Rest API 时出现 Cors 错误

如何防止机器人使用 REST API 调用从移动应用注册新用户?

具有多个参数的 WCF Restful API

使用 FireFox 从 localhost 到 REST 服务的 XMLHttpRequest 的 CORS 问题

使用 Jquery 从 REST API nodeJS 获取数据 [重复]