我尝试使用symfony和FOSOAuthServerBundle捆绑包创建OAuth服务器。我关注this tutorial并且关注"授权码"部分(也许你应该检查之前的部分)。当我在浏览器中打开网址PROVIDER_HOST/oauth/v2/auth?client_id=CLIENT_ID&response_type=code&redirect_uri=CLIENT_HOST
时,我收到了ERR_TOO_MANY_REDIRECTS错误。这是我的日志文件的输出:
[2017-10-11 09:50:58] request.INFO:匹配路线 " fos_oauth_server_authorize&#34 ;. {"路线":" fos_oauth_server_authorize"" route_parameters" {" _controller":" FOS \ OAuthServerBundle \控制器\ AuthorizeController: :authorizeAction"" _route":" fos_oauth_server_authorize"}" REQUEST_URI":" http://example.de/app_dev.php/oauth/v2/auth?client_id=3_4ip472z6jf6scgoog0kssg8so0sosg0ok400w80ccog0s88gs0&redirect_uri=test.local&response_type=code"&# 34;方法":" GET"}
[] [2017-10-11 09:50:58] security.INFO:一个AuthenticationException 抛出;重定向到身份验证入口点。 {"例外":" [对象] (Symfony的\分量\安全\核心\异常\ AuthenticationCredentialsNotFoundException(代码: 0):在TokenStorage中找不到令牌。在 ... /供应商/ symfony的/ symfony的/ SRC / Symfony的/分量/安全性/ HTTP /防火墙/ AccessListener.php:53)"}
[] [2017-10-11 09:50:58] security.DEBUG:调用身份验证条目 点。 [] []
[2017-10-11 09:51:00] request.INFO:匹配路线 " acme_oauth_server_auth_login&#34 ;. {"路线":" acme_oauth_server_auth_login"" route_parameters" {" _controller":" SsoBundle \控制器\ SecurityController ::则loginAction& #34;" _route":" acme_oauth_server_auth_login"}" REQUEST_URI":" http://example.de/app_dev.php/oauth/v2/auth_login""方法":" GET"}
[] [2017-10-11 09:51:00] security.INFO:一个AuthenticationException 抛出;重定向到身份验证入口点。 {"例外":" [对象] (Symfony的\分量\安全\核心\异常\ AuthenticationCredentialsNotFoundException(代码: 0):在TokenStorage中找不到令牌。在 ... /供应商/ symfony的/ symfony的/ SRC / Symfony的/分量/安全性/ HTTP /防火墙/ AccessListener.php:53)"}
[] [2017-10-11 09:51:00] security.DEBUG:调用身份验证条目 点。 [] []
现在重复最后3个日志...我试图在AuthorizeController和SecurityController中使用echo "test"; die();
进行调试,但这甚至无法正常工作。
这是我的SecurityController:
namespace SsoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
class SecurityController extends Controller
{
public function loginAction(Request $request)
{
$session = $request->getSession();
if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
$error = $request->attributes->get(Security::AUTHENTICATION_ERROR);
} elseif (null !== $session && $session->has(Security::AUTHENTICATION_ERROR)) {
$error = $session->get(Security::AUTHENTICATION_ERROR);
$session->remove(Security::AUTHENTICATION_ERROR);
} else {
$error = '';
}
if ($error) {
$error = $error->getMessage(
); // WARNING! Symfony source code identifies this line as a potential security threat.
}
$lastUsername = (null === $session) ? '' : $session->get(Security::LAST_USERNAME);
return $this->render(
'SsoBundle:Security:login.html.twig',
array(
'last_username' => $lastUsername,
'error' => $error,
)
);
}
public function loginCheckAction(Request $request)
{
}
}
这是我的security.yml:
security:
# https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
in_memory:
memory: ~
user_provider:
id: platform.user.provider
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
oauth_token:
pattern: ^/oauth/v2/token
security: false
secured_area:
pattern: ^/
form_login:
provider: user_provider
check_path: /oauth/v2/auth_login_check
login_path: /oauth/v2/auth_login
logout:
path: /logout
target: /
oauth_authorize:
pattern: ^/oauth/v2/auth
form_login:
provider: user_provider
check_path: /oauth/v2/auth_login_check
login_path: /oauth/v2/auth_login
anonymous: true
api:
pattern: ^/api/.*
fos_oauth: true
stateless: true
main:
anonymous: ~
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
#http_basic: ~
# https://symfony.com/doc/current/security/form_login_setup.html
#form_login: ~
encoders:
SsoBundle\Entity\User:
algorithm: sha1
encode_as_base64: false
iterations: 1
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
access_control:
- { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }
- { path: ^/demo/secured/hello/admin/, roles: ROLE_ADMIN }
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
我不得不从教程中改变一些东西,因为它不能正常工作。但现在我不知道这次能做些什么。
任何人都知道可能是什么问题?如果您需要更多代码,请告诉我们。谢谢!
答案 0 :(得分:1)
Symfony将选择适合url的第一个防火墙。在您的情况下,多个防火墙将与reqrep ^([^\ :]*)\ /foo/foo/(.*) \1\ /\2
匹配。 ^/oauth/v2/auth
和secured_area
都有。由于oauth_authorize
看起来像是一个回退,可以捕获其他防火墙未覆盖的所有网址,因此您可能希望将其移至文件的末尾,因此最后检查它。
我的猜测是secured_area
(不允许匿名访问?)被调用,然后将重定向以要求在同一防火墙上进行身份验证登陆,从而进行循环。