[API][Shop] Add customer login

This commit is contained in:
Grzegorz Sadowski 2020-03-30 14:46:28 +02:00
parent 649aa77c69
commit 0732d96305
No known key found for this signature in database
GPG key ID: EF87FF4E6E3BD364
13 changed files with 319 additions and 115 deletions

View file

@ -22,18 +22,22 @@
+ sylius.security.new_api_route: "/new-api"
+ sylius.security.new_api_admin_route: "%sylius.security.new_api_route%/admin"
+ sylius.security.new_api_admin_regex: "^%sylius.security.new_api_admin_route%"
+ sylius.security.new_api_shop_route: "%sylius.security.new_api_route%/shop"
+ sylius.security.new_api_shop_regex: "^%sylius.security.new_api_shop_route%"
security:
providers:
+ sylius_admin_api_user_provider:
+ sylius_api_admin_user_provider:
+ id: sylius.admin_user_provider.email_or_name_based
+ sylius_api_shop_user_provider:
+ id: sylius.shop_user_provider.email_or_name_based
firewalls:
+ new_api_admin:
+ pattern: "%sylius.security.new_api_admin_regex%/.*"
+ stateless: true
+ anonymous: true
+ provider: sylius_admin_api_user_provider
+ provider: sylius_api_admin_user_provider
+ json_login:
+ check_path: "%sylius.security.new_api_admin_route%/authentication-token"
+ username_path: email
@ -42,11 +46,28 @@
+ failure_handler: lexik_jwt_authentication.handler.authentication_failure
+ guard:
+ authenticators:
+ - lexik_jwt_authentication.jwt_token_authenticator
+ new_api_shop:
+ pattern: "%sylius.security.new_api_shop_regex%/.*"
+ stateless: true
+ anonymous: true
+ provider: sylius_api_shop_user_provider
+ json_login:
+ check_path: "%sylius.security.new_api_shop_route%/authentication-token"
+ username_path: email
+ password_path: password
+ success_handler: lexik_jwt_authentication.handler.authentication_success
+ failure_handler: lexik_jwt_authentication.handler.authentication_failure
+ guard:
+ authenticators:
+ - lexik_jwt_authentication.jwt_token_authenticator
access_control:
+ - { path: "%sylius.security.new_api_admin_regex%/authentication-token", role: IS_AUTHENTICATED_ANONYMOUSLY }
+ - { path: "%sylius.security.new_api_admin_regex%/.*", role: ROLE_API_ACCESS }
+ - { path: "%sylius.security.new_api_shop_regex%/authentication-token", role: IS_AUTHENTICATED_ANONYMOUSLY }
+ - { path: "%sylius.security.new_api_shop_regex%/account", role: ROLE_USER }
+ - { path: "%sylius.security.new_api_route%/docs", role: IS_AUTHENTICATED_ANONYMOUSLY }
```

View file

@ -5,16 +5,20 @@ parameters:
sylius.security.new_api_route: "/new-api"
sylius.security.new_api_admin_route: "%sylius.security.new_api_route%/admin"
sylius.security.new_api_admin_regex: "^%sylius.security.new_api_admin_route%"
sylius.security.new_api_shop_route: "%sylius.security.new_api_route%/shop"
sylius.security.new_api_shop_regex: "^%sylius.security.new_api_shop_route%"
security:
always_authenticate_before_granting: true
providers:
sylius_admin_user_provider:
id: sylius.admin_user_provider.email_or_name_based
sylius_admin_api_user_provider:
sylius_api_admin_user_provider:
id: sylius.admin_user_provider.email_or_name_based
sylius_shop_user_provider:
id: sylius.shop_user_provider.email_or_name_based
sylius_api_shop_user_provider:
id: sylius.shop_user_provider.email_or_name_based
encoders:
Sylius\Component\User\Model\UserInterface: argon2i
firewalls:
@ -53,7 +57,7 @@ security:
pattern: "%sylius.security.new_api_admin_regex%/.*"
stateless: true
anonymous: true
provider: sylius_admin_api_user_provider
provider: sylius_api_admin_user_provider
json_login:
check_path: "%sylius.security.new_api_admin_route%/authentication-token"
username_path: email
@ -64,6 +68,21 @@ security:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
new_api_shop:
pattern: "%sylius.security.new_api_shop_regex%/.*"
stateless: true
anonymous: true
provider: sylius_api_shop_user_provider
json_login:
check_path: "%sylius.security.new_api_shop_route%/authentication-token"
username_path: email
password_path: password
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
api:
pattern: "%sylius.security.api_regex%/.*"
provider: sylius_admin_user_provider
@ -125,4 +144,7 @@ security:
- { path: "%sylius.security.new_api_admin_regex%/authentication-token", role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: "%sylius.security.new_api_admin_regex%/.*", role: ROLE_API_ACCESS }
- { path: "%sylius.security.new_api_shop_regex%/authentication-token", role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: "%sylius.security.new_api_shop_regex%/account", role: ROLE_USER }
- { path: "%sylius.security.new_api_route%/docs", role: IS_AUTHENTICATED_ANONYMOUSLY }

View file

@ -8,7 +8,7 @@ Feature: Signing in to the store
Given the store operates on a single channel in "United States"
And there is a user "ted@example.com" identified by "bear"
@ui
@ui @api
Scenario: Sign in with email and password
When I want to log in
And I specify the username as "ted@example.com"

View file

@ -8,7 +8,7 @@ Feature: Signing in to the store validation
Given the store operates on a single channel in "United States"
And there is a user "ted@example.com" identified by "bear"
@ui
@ui @api
Scenario: Trying to sign in with bad credentials
When I want to log in
And I specify the username as "bear@example.com"
@ -27,7 +27,7 @@ Feature: Signing in to the store validation
Then I should be notified about disabled account
And I should not be logged in
@ui
@ui @api
Scenario: Trying to sign in after my account was deleted
Given my account "ted@example.com" was deleted
When I want to log in

View file

@ -15,14 +15,18 @@ final class ApiPlatformSecurityClient implements ApiSecurityClientInterface
/** @var array */
private $request = [];
public function __construct(AbstractBrowser $client)
/** @var string */
private $section;
public function __construct(AbstractBrowser $client, string $section)
{
$this->client = $client;
$this->section = $section;
}
public function prepareLoginRequest(): void
{
$this->request['url'] = '/new-api/admin/authentication-token';
$this->request['url'] = sprintf('/new-api/%s/authentication-token', $this->section);
$this->request['method'] = 'POST';
}

View file

@ -0,0 +1,77 @@
<?php
declare(strict_types=1);
namespace Sylius\Behat\Context\Api\Shop;
use Behat\Behat\Context\Context;
use Sylius\Behat\Client\ApiSecurityClientInterface;
use Webmozart\Assert\Assert;
final class LoginContext implements Context
{
/** @var ApiSecurityClientInterface */
private $client;
public function __construct(ApiSecurityClientInterface $client)
{
$this->client = $client;
}
/**
* @When I want to log in
*/
public function iWantToLogIn(): void
{
$this->client->prepareLoginRequest();
}
/**
* @When I specify the username as :username
*/
public function iSpecifyTheUsername(string $username): void
{
$this->client->setEmail($username);
}
/**
* @When I specify the password as :password
*/
public function iSpecifyThePasswordAs(string $password): void
{
$this->client->setPassword($password);
}
/**
* @When I log in
* @When I try to log in
*/
public function iLogIn(): void
{
$this->client->call();
}
/**
* @Then I should be logged in
*/
public function iShouldBeLoggedIn(): void
{
Assert::true($this->client->isLoggedIn(), 'Shop user should be logged in, but they are not.');
}
/**
* @Then I should not be logged in
*/
public function iShouldNotBeLoggedIn(): void
{
Assert::false($this->client->isLoggedIn(), 'Shop user should not be logged in, but they are.');
}
/**
* @Then I should be notified about bad credentials
*/
public function iShouldBeNotifiedAboutBadCredentials(): void
{
Assert::same($this->client->getErrorMessage(), 'Invalid credentials.');
}
}

View file

@ -107,8 +107,14 @@
<argument type="service" id="test.client" />
</service>
<service id="Sylius\Behat\Client\ApiSecurityClientInterface" class="Sylius\Behat\Client\ApiPlatformSecurityClient">
<service id="sylius.behat.client.admin_api_platform_security_client" class="Sylius\Behat\Client\ApiPlatformSecurityClient">
<argument type="service" id="test.client" />
<argument>admin</argument>
</service>
<service id="sylius.behat.client.shop_api_platform_security_client" class="Sylius\Behat\Client\ApiPlatformSecurityClient">
<argument type="service" id="test.client" />
<argument>shop</argument>
</service>
</services>
</container>

View file

@ -11,109 +11,12 @@
-->
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<defaults public="true" />
<service id="sylius.behat.context.api.admin.login" class="Sylius\Behat\Context\Api\Admin\LoginContext">
<argument type="service" id="Sylius\Behat\Client\ApiSecurityClientInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_administrators" class="Sylius\Behat\Context\Api\Admin\ManagingAdministratorsContext">
<argument type="service" id="sylius.behat.api_platform_client.administrator" />
<argument type="service" id="sylius.behat.api_platform_client.avatar_image" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
<argument type="service" id="sylius.behat.shared_storage" />
<argument type="service" id="behat.mink.parameters" />
</service>
<service id="sylius.behat.context.api.admin.managing_currencies" class="Sylius\Behat\Context\Api\Admin\ManagingCurrenciesContext">
<argument type="service" id="sylius.behat.api_platform_client.currency" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_exchange_rates" class="Sylius\Behat\Context\Api\Admin\ManagingExchangeRatesContext">
<argument type="service" id="sylius.behat.api_platform_client.exchange_rate" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
<service id="sylius.behat.context.api.admin.managing_locales" class="Sylius\Behat\Context\Api\Admin\ManagingLocalesContext">
<argument type="service" id="sylius.behat.api_platform_client.locale" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_product_options" class="Sylius\Behat\Context\Api\Admin\ManagingProductOptionsContext">
<argument type="service" id="sylius.behat.api_platform_client.product_option" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
<service id="sylius.behat.context.api.admin.managing_product_variants" class="Sylius\Behat\Context\Api\Admin\ManagingProductVariantsContext">
<argument type="service" id="test.client" />
<argument type="service" id="session" />
</service>
<service id="sylius.behat.context.api.admin.managing_products" class="Sylius\Behat\Context\Api\Admin\ManagingProductsContext">
<argument type="service" id="sylius.behat.api_platform_client.products" />
<argument type="service" id="sylius.behat.api_platform_client.product_review" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
<service id="sylius.behat.context.api.admin.managing_tax_categories" class="Sylius\Behat\Context\Api\Admin\ManagingTaxCategoriesContext">
<argument type="service" id="sylius.behat.api_platform_client.tax_category" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_taxons" class="Sylius\Behat\Context\Api\Admin\ManagingTaxonsContext">
<argument type="service" id="test.client" />
<argument type="service" id="session" />
</service>
<service id="sylius.behat.context.api.admin.managing_shipping_categories" class="Sylius\Behat\Context\Api\Admin\ManagingShippingCategoriesContext">
<argument type="service" id="sylius.behat.api_platform_client.shipping_category" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_shipping_methods" class="Sylius\Behat\Context\Api\Admin\ManagingShippingMethodsContext">
<argument type="service" id="sylius.behat.api_platform_client.shipping_method" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
</service>
<service id="sylius.behat.context.api.admin.managing_product_reviews" class="Sylius\Behat\Context\Api\Admin\ManagingProductReviewsContext">
<argument type="service" id="sylius.behat.api_platform_client.product_review" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
<service id="sylius.behat.context.api.admin.managing_customer_groups" class="Sylius\Behat\Context\Api\Admin\ManagingCustomerGroupsContext">
<argument type="service" id="sylius.behat.api_platform_client.customer_group" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_payments" class="Sylius\Behat\Context\Api\Admin\ManagingPaymentsContext">
<argument type="service" id="sylius.behat.api_platform_client.payment" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
</service>
<service id="sylius.behat.context.api.admin.managing_shipments" class="Sylius\Behat\Context\Api\Admin\ManagingShipmentsContext">
<argument type="service" id="sylius.behat.api_platform_client.shipment" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
</service>
<service id="sylius.behat.context.api.admin.managing_orders" class="Sylius\Behat\Context\Api\Admin\ManagingOrdersContext">
<argument type="service" id="sylius.behat.api_platform_client.order" />
<argument type="service" id="sylius.behat.api_platform_client.shipment" />
<argument type="service" id="sylius.behat.api_platform_client.payment" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
</services>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<imports>
<import resource="api/admin.xml" />
<import resource="api/shop.xml" />
</imports>
</container>

View file

@ -0,0 +1,122 @@
<?xml version="1.0" ?>
<!--
This file is part of the Sylius package.
(c) Paweł Jędrzejewski
For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
-->
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<services>
<defaults public="true" />
<service id="sylius.behat.context.api.admin.login" class="Sylius\Behat\Context\Api\Admin\LoginContext">
<argument type="service" id="sylius.behat.client.admin_api_platform_security_client" />
</service>
<service id="sylius.behat.context.api.admin.managing_administrators" class="Sylius\Behat\Context\Api\Admin\ManagingAdministratorsContext">
<argument type="service" id="sylius.behat.api_platform_client.administrator" />
<argument type="service" id="sylius.behat.api_platform_client.avatar_image" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
<argument type="service" id="sylius.behat.shared_storage" />
<argument type="service" id="behat.mink.parameters" />
</service>
<service id="sylius.behat.context.api.admin.managing_currencies" class="Sylius\Behat\Context\Api\Admin\ManagingCurrenciesContext">
<argument type="service" id="sylius.behat.api_platform_client.currency" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_exchange_rates" class="Sylius\Behat\Context\Api\Admin\ManagingExchangeRatesContext">
<argument type="service" id="sylius.behat.api_platform_client.exchange_rate" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
<service id="sylius.behat.context.api.admin.managing_locales" class="Sylius\Behat\Context\Api\Admin\ManagingLocalesContext">
<argument type="service" id="sylius.behat.api_platform_client.locale" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_product_options" class="Sylius\Behat\Context\Api\Admin\ManagingProductOptionsContext">
<argument type="service" id="sylius.behat.api_platform_client.product_option" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
<service id="sylius.behat.context.api.admin.managing_product_variants" class="Sylius\Behat\Context\Api\Admin\ManagingProductVariantsContext">
<argument type="service" id="test.client" />
<argument type="service" id="session" />
</service>
<service id="sylius.behat.context.api.admin.managing_products" class="Sylius\Behat\Context\Api\Admin\ManagingProductsContext">
<argument type="service" id="sylius.behat.api_platform_client.products" />
<argument type="service" id="sylius.behat.api_platform_client.product_review" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
<service id="sylius.behat.context.api.admin.managing_tax_categories" class="Sylius\Behat\Context\Api\Admin\ManagingTaxCategoriesContext">
<argument type="service" id="sylius.behat.api_platform_client.tax_category" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_taxons" class="Sylius\Behat\Context\Api\Admin\ManagingTaxonsContext">
<argument type="service" id="test.client" />
<argument type="service" id="session" />
</service>
<service id="sylius.behat.context.api.admin.managing_shipping_categories" class="Sylius\Behat\Context\Api\Admin\ManagingShippingCategoriesContext">
<argument type="service" id="sylius.behat.api_platform_client.shipping_category" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_shipping_methods" class="Sylius\Behat\Context\Api\Admin\ManagingShippingMethodsContext">
<argument type="service" id="sylius.behat.api_platform_client.shipping_method" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
</service>
<service id="sylius.behat.context.api.admin.managing_product_reviews" class="Sylius\Behat\Context\Api\Admin\ManagingProductReviewsContext">
<argument type="service" id="sylius.behat.api_platform_client.product_review" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
<service id="sylius.behat.context.api.admin.managing_customer_groups" class="Sylius\Behat\Context\Api\Admin\ManagingCustomerGroupsContext">
<argument type="service" id="sylius.behat.api_platform_client.customer_group" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
</service>
<service id="sylius.behat.context.api.admin.managing_payments" class="Sylius\Behat\Context\Api\Admin\ManagingPaymentsContext">
<argument type="service" id="sylius.behat.api_platform_client.payment" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
</service>
<service id="sylius.behat.context.api.admin.managing_shipments" class="Sylius\Behat\Context\Api\Admin\ManagingShipmentsContext">
<argument type="service" id="sylius.behat.api_platform_client.shipment" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
</service>
<service id="sylius.behat.context.api.admin.managing_orders" class="Sylius\Behat\Context\Api\Admin\ManagingOrdersContext">
<argument type="service" id="sylius.behat.api_platform_client.order" />
<argument type="service" id="sylius.behat.api_platform_client.shipment" />
<argument type="service" id="sylius.behat.api_platform_client.payment" />
<argument type="service" id="Sylius\Behat\Client\ResponseCheckerInterface" />
<argument type="service" id="api_platform.iri_converter" />
<argument type="service" id="sylius.behat.shared_storage" />
</service>
</services>
</container>

View file

@ -0,0 +1,25 @@
<?xml version="1.0" ?>
<!--
This file is part of the Sylius package.
(c) Paweł Jędrzejewski
For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
-->
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<services>
<defaults public="true" />
<service id="sylius.behat.context.api.shop.login" class="Sylius\Behat\Context\Api\Shop\LoginContext">
<argument type="service" id="sylius.behat.client.shop_api_platform_security_client" />
</service>
</services>
</container>

View file

@ -2,6 +2,7 @@
# (c) Paweł Jędrzejewski
imports:
- suites/api/account/login.yml
- suites/api/admin/login.yml
- suites/api/currency/managing_currencies.yml
- suites/api/currency/managing_exchange_rates.yml

View file

@ -0,0 +1,19 @@
# This file is part of the Sylius package.
# (c) Paweł Jędrzejewski
default:
suites:
api_customer_login:
contexts:
- sylius.behat.context.hook.doctrine_orm
- sylius.behat.context.transform.user
- sylius.behat.context.setup.channel
- sylius.behat.context.setup.user
- sylius.behat.context.api.shop.login
filters:
tags: "@customer_login && @api"
javascript: false

View file

@ -9,3 +9,7 @@ sylius_api:
sylius_api_admin_authentication_token:
path: /admin/authentication-token
methods: ['POST']
sylius_api_shop_authentication_token:
path: /shop/authentication-token
methods: ['POST']