gpt4 book ai didi

php - 使用 Symfony 5.3 检查 JWT (Firebase) token

转载 作者:行者123 更新时间:2023-12-05 01:06:11 26 4
gpt4 key购买 nike

我正在开发一个 API,并且我已经实现了一个 JWT 以使其无状态。我创建了一个 AuthController,它在登录信息正确时返回一个 JWT。在这里你可以看到生成 token 的返回码:

/* RETURN MESSAGE */
$body = [
'auth_token' => $jwt,
];
$json = new JsonResponse($body);
$json->setStatusCode(201, "Created"); // Headers
return $json;

这是我运行身份验证方法时的结果,在 URL localhost:8000/authenticate 上。
现在,我需要做的是,当用户尝试获取另一个 / URL 时,如果他没有在请求的 header 中传递 Bearer token ,则程序不允许他访问它。但它不起作用。该平台始终允许我输入任何 URL,而无需在标题中设置授权。
这是我的安全文件,我尝试在其中进行设置:

security:
# https://symfony.com/doc/current/security/authenticator_manager.html
enable_authenticator_manager: true

# https://symfony.com/doc/current/security.html#c-hashing-passwords
password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'

encoders:
App\Entity\ATblUsers:
algorithm: bcrypt

providers:
users_in_memory: { memory: null }

firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false

main:
# Anonymous property is no longer supported by Symfony. It is commented by now, but it will be deleted in
# future revision:
# anonymous: true
guard:
authenticators:
- App\Security\JwtAuthenticator
lazy: true
provider: users_in_memory

# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#firewalls-authentication

# https://symfony.com/doc/current/security/impersonating_user.html
# switch_user: true
stateless: true

# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
# - { path: ^/admin, roles: ROLE_ADMIN }
# - { path: ^/profile, roles: ROLE_USER }

最后,这是我的 App\Security\JwtAuthenticator:

namespace App\Security;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Firebase\JWT\JWT;
use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;

class JwtAuthenticator extends AbstractGuardAuthenticator
{
private $em;
private $params;

public function __construct(EntityManagerInterface $em, ContainerBagInterface $params)
{
$this->em = $em;
$this->params = $params;
}

public function start(Request $request, AuthenticationException $authException = null): JsonResponse
{
$body = [
'message' => 'Authentication Required',
];
return new JsonResponse($body, Response::HTTP_UNAUTHORIZED);
}

public function supports(Request $request): bool
{
return $request->headers->has('Authorization');
}

public function getCredentials(Request $request)
{
return $request->headers->get('Authorization');
}

public function getUser($credentials, UserProviderInterface $userProvider)
{
try{
$credentials = str_replace('Bearer ', '', $credentials);
$jwt = (array) JWT::decode($credentials, $this->params->get('jwt_secret'), ['HS256']);
return $this->em->getRepository('App:ATblUsers')->find($jwt['sub']);
}catch (\Exception $exception){
throw new AuthenticationException($exception->getMessage());
}

}

public function checkCredentials($credentials, UserInterface $user)
{

}

public function onAuthenticationFailure(Request $request, AuthenticationException $exception): JsonResponse
{
return new JsonResponse([
'message' => $exception->getMessage()
], Response::HTTP_UNAUTHORIZED);
}

public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
{
return;
}

public function supportsRememberMe(): bool
{
return false;
}
}

我查看了很多网站和教程,但没有人完全按照我的需要进行操作,或者正在实现与我的需要不匹配的非常基本的功能。几乎所有这些网站都使用 Symfony 4 来解释这一点,但我使用的是 Symfony 5,因此教程中使用的许多功能都已弃用。有人知道我错过了什么吗?

最佳答案

您可能在 security.yaml 中缺少 access_control 配置:

security:
# https://symfony.com/doc/current/security/authenticator_manager.html
enable_authenticator_manager: true

# https://symfony.com/doc/current/security.html#c-hashing-passwords
password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'

encoders:
App\Entity\ATblUsers:
algorithm: bcrypt

providers:
users_in_memory: { memory: null }

firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false

main:
# Anonymous property is no longer supported by Symfony. It is commented by now, but it will be deleted in
# future revision:
# anonymous: true
guard:
authenticators:
- App\Security\JwtAuthenticator
lazy: true
provider: users_in_memory

# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#firewalls-authentication

# https://symfony.com/doc/current/security/impersonating_user.html
# switch_user: true
stateless: true

# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- { path: ^/authenticate, roles: PUBLIC_ACCESS }
- { path: ^/, roles: IS_AUTHENTICATED_FULLY }

关于php - 使用 Symfony 5.3 检查 JWT (Firebase) token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69675036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com