Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IBX-8356: Reworked Ibexa\Core\MVC\Symfony\Security\Authentication\AuthenticatorInterface usages to comply with Symfony-based authentication #101

Merged
merged 37 commits into from
Jun 25, 2024

Conversation

konradoboza
Copy link
Contributor

@konradoboza konradoboza commented Jun 5, 2024

🎫 Issue IBX-8356

Related PRs:

Description:

Reimplemented JWT authentication. The need for that comes from the fact, that Ibexa\Core\MVC\Symfony\Security\Authentication\AuthenticatorInterface relies on deprecated Symfony authorization mechanisms and will be dropped.

Reworked to be compliant with https://symfony.com/bundles/LexikJWTAuthenticationBundle/current/index.html#symfony-5-3-and-higher. The third-party provider has already moved to Symfony json_login authenticator so we are just adapting our implementation accordingly.

Few important changes:

  • XML input is not supported from now on. Only Content-Type: application/vnd.ibexa.api.JWT+json header can still be used for keeping the whole solution BC safe, however the new authenticator should be referenced via Content-Type: application/json header instead,
  • to make sure this is possible I added JsonLoginHeaderReplacingSubscriber which replaces mentioned header on the fly. I also left a TODO note to remember it should be dropped once the new REST API version is released. I am open for suggestions how to improve such reminder,
  • I also removed SecurityListener and kind of replaced it with AuthenticationSuccessSubscriber - it sets current repository user on successful authentication and normalize the end response to be in-tact with the previous one (another BC-safe piece of code). The reason for that is that json_login handles the response outside and forms it similar to:
{
    "token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJleHAiOjE0MzQ3Mjc1MzYsInVzZXJuYW1lIjoia29ybGVvbiIsImlhdCI6IjE0MzQ2NDExMzYifQ.nh0L_wuJy6ZKIQWh6OrW5hdLkviTs1_bau2GqYdDCB0Yqy_RplkFghsuqMpsFls8zKEErdX5TYCOR7muX0aQvQxGQ4mpBkvMDhJ4-pE4ct2obeMTr_s4X8nC00rBYPofrOONUOR4utbzvbd4d2xT_tj4TdR_0tsr91Y7VskCRFnoXAnNT-qQb7ci7HIBTbutb9zVStOFejrb4aLbr7Fl4byeIEYgp2Gd7gY"
}
  • I removed the whole logic from Ibexa\Rest\Server\Controller\JWT::createToken - all the heavy lifting is done by the json_login authenticator so it's not needed anymore. The whole controller was left though, as to my understanding it is needed for the route to be configured properly. If this is wrong, the whole class can just be dropped,
  • I removed classes needed for input parsing and value object visiting since payload/response are formed differently as they become obsolete,
  • src/lib/Security/AuthorizationHeaderRESTRequestMatcher.php was moved out of contracts and marked as @internal as we shouldn't allow manipulating with such vital part of the authentication process,
  • I added test coverage to the introduced event subscribers,
  • I improved the code quality in several classes by resolving outstanding PHPStan issues.

For QA:

Documentation:

We need to mention changes to payload, response and headers described above as much as removed/moved classes.

@konradoboza konradoboza changed the title IBX-8356: Reworked `Ibexa\Core\MVC\Symfony\Security\Authentication\Au… IBX-8356: Reworked Ibexa\Core\MVC\Symfony\Security\Authentication\AuthenticatorInterface usages to comply with Symfony-based authentication Jun 5, 2024
@konradoboza konradoboza force-pushed the ibx-8290-re-implement-rest-auth branch from b0508ca to a3b1471 Compare June 6, 2024 09:24
@konradoboza konradoboza force-pushed the ibx-8356-removed-authenticatorinterface branch 5 times, most recently from d7547bf to e73f707 Compare June 6, 2024 13:13
@konradoboza konradoboza force-pushed the ibx-8290-re-implement-rest-auth branch 2 times, most recently from 9d185ea to 5c75500 Compare June 7, 2024 07:03
@konradoboza konradoboza force-pushed the ibx-8356-removed-authenticatorinterface branch 3 times, most recently from bce578a to 02f4263 Compare June 7, 2024 09:49
@konradoboza konradoboza force-pushed the ibx-8290-re-implement-rest-auth branch from 9c8f8c2 to b23cde0 Compare June 7, 2024 10:52
@konradoboza konradoboza force-pushed the ibx-8356-removed-authenticatorinterface branch from 02f4263 to 37babd1 Compare June 7, 2024 14:17
@konradoboza konradoboza marked this pull request as ready for review June 10, 2024 12:49
@konradoboza konradoboza added Ready for review Doc needed The changes require some documentation labels Jun 10, 2024
@konradoboza konradoboza requested a review from a team June 10, 2024 12:58
@konradoboza konradoboza requested review from alongosz and a team June 11, 2024 06:16
@Steveb-p
Copy link
Contributor

I would need to know why the matcher specifically is being dropped, and what will be the new expected user configuration.

We used to use Matcher to allow firewalls to detect that they need to perform authorization in a specific way - and I assume that we are going to change it so that authentication mechanisms are no longer tied to firewalls like that. But I need to see the expected end result to judge.

@konradoboza
Copy link
Contributor Author

I would need to know why the matcher specifically is being dropped

Can you please elaborate which matcher you have in mind? The configuration is tackled within https://github.com/ibexa/recipes-dev/pull/122/files.

@konradoboza konradoboza force-pushed the ibx-8356-removed-authenticatorinterface branch from 3173e5b to 50f9fbe Compare June 11, 2024 07:50
@Steveb-p
Copy link
Contributor

I would need to know why the matcher specifically is being dropped

Can you please elaborate which matcher you have in mind? The configuration is tackled within https://github.com/ibexa/recipes-dev/pull/122/files.

Ibexa\Rest\Security\AuthorizationHeaderRESTRequestMatcher (known before as Ibexa\Contracts\Rest\Security\AuthorizationHeaderRESTRequestMatcher). As @alongosz mentioned in his comments, if it's intended to be used in the configuration as a value, it has to remain in Contracts namespace.

@konradoboza konradoboza force-pushed the ibx-8356-removed-authenticatorinterface branch from 99e5fea to c7df328 Compare June 20, 2024 13:32
@konradoboza konradoboza force-pushed the ibx-8356-removed-authenticatorinterface branch from e94ba89 to 35307f0 Compare June 20, 2024 13:47
Copy link

Copy link
Contributor

@micszo micszo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small suggestion for follow-up PR:

When using unsupported XML format error description could be more user friendly.
Now it states: "You must provide a ValueObject for visiting, "NULL" provided."

@micszo micszo removed their assignment Jun 25, 2024
@konradoboza konradoboza merged commit dedcfa0 into main Jun 25, 2024
9 checks passed
@konradoboza konradoboza deleted the ibx-8356-removed-authenticatorinterface branch June 25, 2024 14:18
@Steveb-p
Copy link
Contributor

Small suggestion for follow-up PR:

When using unsupported XML format error description could be more user friendly. Now it states: "You must provide a ValueObject for visiting, "NULL" provided."

It's something we might address when swapping over to Symfony Serializer for request parsing. Our current Visitors are barely performing sanity checks at all, and that error sounds more like something PHP would spew on it's own.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Doc needed The changes require some documentation QA approved
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants