我无法使用Authorization: Bearer -token-发布某些内容,而且我几乎不怀疑我的服务器配置。
我正在一个基于wordpress的服务器中使用mamp pro。该服务器提供一个api(这不是restapi wordpress插件)。当我使用postman时,这个api工作得很好。
我的典型用例是:
以username/pwd为参数在post中从https://front-end.com/login.html发布到https://back-end.com/api/users/auth
返回名为myToken的jwt令牌
以input1/input2为参数,Authorization: Bearer <myToken>为标题的post从https://front-end.com/index.htmlhttps://back-end.com/api/alert
步骤1的js代码

const API_ROOT_URL = "https://back-end.com";
const API_AUTH = "api/users/auth";
const API_ALERT = "api/alert";
const METHOD_POST = "POST";

return new Promise((resolve: any, reject: any) => {
let request = new XMLHttpRequest();
            request.open(METHOD_POST, API_ROOT_URL+"/"+API_AUTH);
           // request.setRequestHeader('Content-Type', 'multipart/form-data');
            request.onload = () => resolve(request.response);
            request.onerror = () => reject(request.response);
            request.send(formData);

步骤3的js代码:
        return new Promise((resolve: any, reject: any) => {
        let request = new XMLHttpRequest();
        request.open(METHOD_POST, API_ROOT_URL+"/"+API_ALERT);
        request.setRequestHeader('Authorization', "Bearer  "+ AnotherClass.getJwtToken());
      //  request.setRequestHeader('Content-Type', 'multipart/form-data');
        request.onload = () => resolve(request.status);
        request.onerror = () => reject(request.status);
        request.send(formData);
    });

步骤1工作正常。jwt令牌使用postman或front-end.com上的常规webapp检索。
步骤3对postman很好,在这里我的表单被成功地发布了,我收到了一个200。
但当我将它与我的webapp一起使用时,我无法通过飞行前选项请求。
注意,我还使用mockable.io(也就是https)模拟了我的api,请求成功通过;这在我们的例子中并不重要,但这就是我怀疑服务器配置错误的原因。
测试:
a.在MAMP虚拟主机中重写规则:
RewriteEngine onRewriteCond %{HTTP:Authorization} ^(.*)RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
B.在WordPress服务器的HTTAccess中重写规则(与上述相同,在现有重写规则之后进行推送)
c.出于测试目的,删除“授权:持票人”以查看请求是否发送(这并不奇怪)
d.尝试在.htaccess中添加SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1,包括或不包括以前的重写规则。
如上面js代码所述,试图将contet类型硬设为multipart,但没有任何改进。
f.试图在端点api_警报中添加/以防wordpress做愚蠢的重定向(以前经历过)
我现在完全不知道该去哪里找。我怀疑是apache配置阻塞了授权,或者wordpress干扰了cors或授权。

最佳答案

如果这有一个副标题,那就是“jwt在一个不使用插件的自定义wordpress上授权的故事,在另一个使用服务工作者和xhr的域上使用javascript webapp”
自动祝贺自己,但特别感谢https://www.html5rocks.com/en/tutorials/cors/,提供了服务器和脚本如何交互的清晰信息。
使用wordpress,我的解决方案是(我对js代码没有做任何更改):
#BEGIN WordPress语句前添加以下内容

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
</IfModule>

在您的路由服务中,使用以下方法野蛮地绕过“addroute”方法:
$this->routes[] = [ltrim("/api/alert", '/'), [$myApiController, 'alertAction']];

在api控制器中创建入口点函数alertaction
public function alertAction()
{
  $request = Request::getInstance();
  if(!$request->isXmlHttpRequest()) {
    switch($request->getMethod()) {
        case Request::METHOD_OPTIONS:
            $this->handleOptionsMethod();
            break;
        case Request::METHOD_POST:
            $this->handlePostMethod($request);
            break;
        default:
            $response = new Result(404);
            status_header($result->getCode());
            echo $response;
            die();
            break;
    }
}

}
$myApiControler方法中创建适当的options响应,其中包含所需的头
private function handleOptionsMethod() {
  $response = new Result(200);
  status_header($response->getCode());
  header('Access-Control-Allow-Origin: *');
  header('Access-Control-Allow-Methods: POST');
  header('Access-Control-Allow-Headers: Authorization');
  echo $response;
  die();
}

在handlePostMethod()方法中,执行您必须执行的操作。
private function handlePostMethod($request) {

  $requestData = $request->request->all();
  $authorization = $request->headers->get('Authorization');

  $jwt = str_replace('Bearer ', '', $authorization);
  $decoded = JWT::decode($jwt, JWT_SECRET_KEY, array('HS256'));
  $userId = (int) $decoded->data->userId;
  ...
  $response = new Result(200)
  status_header($result->getCode());
  echo $response;
  die();
}

然而,基本上:
-允许服务器读取额外的http信息
-允许你的wordpress实例根据选项请求执行特定的操作
-创建脚本允许飞行前请求所需的响应头(在我的示例中允许“授权”自定义头)
-创建常规请求处理程序(post或get)。
希望这对你们有些人有帮助。
我的问题的最后一部分是,既然post请求成功触发,服务工作者就无法工作,因此我无法访问“响应”并正确处理它。但我已经向前迈出了一大步,我想和你们中的一些人分享。

07-28 01:28
查看更多