PHP Slim 4-使用firebase JWT令牌授权api请求

PHP Slim 4-使用firebase JWT令牌授权api请求,php,firebase,firebase-authentication,jwt,slim,Php,Firebase,Firebase Authentication,Jwt,Slim,我正在尝试验证firebase javascript sdk为slim 4提供的Tuupola Jwt中间件提供的idToken,但我总是得到一个401错误。这是我用来获取令牌的客户端代码: const provider = new firebase.auth.GoogleAuthProvider(); provider.addScope("profile"); provider.addScope("email"); firebase.auth().sig

我正在尝试验证firebase javascript sdk为slim 4提供的Tuupola Jwt中间件提供的idToken,但我总是得到一个401错误。这是我用来获取令牌的客户端代码:

const provider = new firebase.auth.GoogleAuthProvider();
provider.addScope("profile");
provider.addScope("email");
firebase.auth().signInWithPopup(provider).then( (result) => {
 console.log(result);   
});
身份验证流将如预期的那样正常工作,我能够将令牌传递到授权头中,但我无法在使用slim 4实现Restful api的服务器上验证它

我读过不同的文章,但这些都没有帮助我解决这个问题

以下是我的中间件实现:

use Tuupola\Middleware\CorsMiddleware;
use Tuupola\Middleware\JwtAuthentication;
use Slim\App as App;

return function(App $app) {
    $app->add(new Tuupola\Middleware\CorsMiddleware([
        "origin" => ["chrome-extension://oegddbimpfdpbojkmfibkebnagidflfc"],
        "methods" => ["GET", "POST", "OPTIONS"],
        "headers.allow" => ["Authorization"],
        "headers.expose" => [],
        "credentials" => true,
        "cache" => 86400
    ]));

//    $rawPublicKeys = file_get_contents('https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com');
//    $keys = json_decode($rawPublicKeys, true);
    $keys = file_get_contents('https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com');

    $app->add(new Tuupola\Middleware\JwtAuthentication([
        "algorithm" => ["RS256"],
        "header" => "X-Authorization",
        "regexp" => "/Bearer\s+(.*)$/i",
        "secret" => $keys,
        "secure" => false,
        "after" => function ($response, $arguments) {
            return $response->withHeader("X-Brawndo", "plants crave"); //this is only for test
        }
    ]));

};
这就是我运行slim应用程序的index.php文件中的内容

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface;
use Slim\Routing\RouteCollectorProxy;
use Slim\Routing\RouteContext;
use Slim\Factory\AppFactory;
use Tuupola\Middleware\CorsMiddleware;

require_once __DIR__.'/vendor/autoload.php';

$app = AppFactory::create();

$authMiddleware = require_once __DIR__.'/middleware.php';
$authMiddleware($app);

$app->get('/keygen', function(Request $request, Response $response, $args){  
    $password = bin2hex(random_bytes(3));
    $response->getBody()->write( json_encode(['generated_password' => $password]) );
    return $response->withHeader('Content-Type','application/json');
});

$app->add(new Tuupola\Middleware\CorsMiddleware([
    "origin" => ["*"],
    "methods" => ["GET", "POST", "OPTIONS"],
    "headers.allow" => ["Authorization"],
    "headers.expose" => [],
    "credentials" => true,
    "cache" => 86400
]));

$app->run();
我想要实现的是使用客户端登录后提供的firebase idToken对客户端向api发出的每个请求进行身份验证。当发出请求时,中间件将验证令牌,然后授权用户或不使用端点


有可能解决这个问题吗?

经过大量调试,我发现并解决了这个问题。在我的客户端代码中,我使用了错误的
idToken
作为
Authorization:Bearer
,而且发送到服务器的头与中间件配置不匹配,在我的axios请求中,我发送的是
X-Authorization
头,而不是
Authorization
。为了获得要使用的正确令牌,我调用了
firebase.auth().onAuthStateChanged((user)=>{…})
方法,当用户对象可用时,我调用了
getIdToken()
方法。此操作返回正确的JWT令牌,用于中间件对请求进行身份验证。

经过大量调试,我发现并解决了问题。在我的客户端代码中,我使用了错误的
idToken
作为
Authorization:Bearer
,而且发送到服务器的头与中间件配置不匹配,在我的axios请求中,我发送的是
X-Authorization
头,而不是
Authorization
。为了获得要使用的正确令牌,我调用了
firebase.auth().onAuthStateChanged((user)=>{…})
方法,当用户对象可用时,我调用了
getIdToken()
方法。此操作返回正确的JWT令牌,用于中间件对请求进行身份验证