Skip to content

Commit ee83584

Browse files
authored
Merge pull request #101 from Howriq/issue-96
issue #96: new structure: split the code in Core and App
2 parents 3b7ff53 + 7236333 commit ee83584

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+4077
-4
lines changed

docs/book/v5/introduction/introduction.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Therefore, for every preflight request, there is at least one Router request.
2929
## OAuth 2.0
3030

3131
OAuth 2.0 is an authorization framework that enables applications to obtain limited access to user accounts on your Dotkernel API.
32-
We use [mezzio/mezzio-authentication-oauth2](https://github.com/mezzio/mezzio-authentication-oauth2) which provides OAuth 2.0 authentication for Mezzio and PSR-7/PSR-15 applications by using the [thephpleague/oauth2-server]https://github.com/thephpleague/oauth2-server package.
32+
We use [mezzio/mezzio-authentication-oauth2](https://github.com/mezzio/mezzio-authentication-oauth2) which provides OAuth 2.0 authentication for Mezzio and PSR-7 applications by using the [thephpleague/oauth2-server]https://github.com/thephpleague/oauth2-server package.
3333

3434
## Email
3535

docs/book/v5/introduction/packages.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
* `laminas/laminas-inputfilter` - Normalize and validate input sets from the web, APIs, the CLI, and more, including files
2121
* `laminas/laminas-stdlib` - SPL extensions, array utilities, error handlers, and more
2222
* `mezzio/mezzio` - PSR-15 Middleware Microframework
23-
* `mezzio/mezzio-authentication-oauth2` - OAuth2 (server) authentication middleware for Mezzio and PSR-7 applications
23+
* `mezzio/mezzio-authentication-oauth2` - OAuth2 (server) authentication middleware for Mezzio and PSR-15 applications
2424
* `mezzio/mezzio-authorization-acl` - laminas-permissions-acl adapter for mezzio-authorization
2525
* `mezzio/mezzio-authorization-rbac` - mezzio authorization rbac adapter for laminas/laminas-permissions-rbac
2626
* `mezzio/mezzio-cors` - CORS component for Mezzio and other PSR-15 middleware runners
2727
* `mezzio/mezzio-fastroute` - FastRoute integration for Mezzio
28-
* `mezzio/mezzio-hal` - Hypertext Application Language implementation for PHP and PSR-7
29-
* `mezzio/mezzio-problem-details` - Problem Details for PSR-7 HTTP APIs addressing the RFC 7807 standard
28+
* `mezzio/mezzio-hal` - Hypertext Application Language implementation for PHP and PSR-15
29+
* `mezzio/mezzio-problem-details` - Problem Details for PSR-15 HTTP APIs addressing the RFC 7807 standard
3030
* `mezzio/mezzio-twigrenderer` - Twig integration for Mezzio
3131
* `ramsey/uuid-doctrine` - Use ramsey/uuid as a Doctrine field type
3232
* `roave/psr-container-doctrine` - Doctrine Factories for PSR-11 Containers

docs/book/v5/upgrading/UPGRADE-5.3.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
# UPGRADE FROM 5.2 TO 5.3
23

34
-------------------------
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Creating admin accounts in Dotkernel API
2+
3+
## Usage
4+
5+
Run the following command in your application’s root directory:
6+
7+
```shell
8+
php ./bin/cli.php admin:create-admin -i {IDENTITY} -p {PASSWORD} -f {FIRST_NAME} -l {LAST_NAME}
9+
```
10+
11+
OR
12+
13+
```shell
14+
php ./bin/cli.php admin:create-admin --identity {IDENTITY} --password {PASSWORD} --firstName {FIRST_NAME} --lastName {LAST_NAME}
15+
```
16+
17+
after replacing:
18+
19+
* {IDENTITY} with a valid username OR email address
20+
* {PASSWORD} with a valid password
21+
* {FIRST_NAME} and {LAST_NAME} with valid names
22+
23+
**NOTE:**
24+
25+
* if the specified fields contain special characters, make sure you surround them with double quote signs
26+
* this method does not allow specifying an admin role – newly created accounts will have role of admin
27+
28+
If the submitted data is valid, the outputted response is:
29+
30+
```text
31+
Admin account has been created.
32+
```
33+
34+
The new admin account is ready to use.
35+
36+
You can get more help with this command by running:
37+
38+
```shell
39+
php ./bin/cli.php help admin:create
40+
```
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Displaying Dotkernel API endpoints using dot-cli
2+
3+
## Usage
4+
5+
Run the following command in your application’s root directory:
6+
7+
```shell
8+
php ./bin/cli.php route:list
9+
```
10+
11+
The command runs through all routes and extracts endpoint information in realtime.
12+
The output should be similar to the following:
13+
14+
```text
15+
+-------------------- 37 Routes ------+-------------------------------------+
16+
| Request method | Route name | Route path |
17+
+----------------+-------------------------------------+-------------------------------------+
18+
| GET | app::view-index | / |
19+
| GET | admin::list-admin | /admin |
20+
| POST | admin::create-admin | /admin |
21+
| GET | admin::view-account | /admin/account |
22+
| PATCH | admin::update-account | /admin/account |
23+
| GET | admin::list-role | /admin/role |
24+
| GET | admin::view-role | /admin/role/{uuid} |
25+
| DELETE | admin::delete-admin | /admin/{uuid} |
26+
| GET | admin::view-admin | /admin/{uuid} |
27+
| PATCH | admin::update-admin | /admin/{uuid} |
28+
| POST | app::create-error-report | /error-report |
29+
| POST | security::token | /security/token |
30+
| GET | user::list-user | /user |
31+
| POST | user::create-user | /user |
32+
| DELETE | user::delete-account | /user/account |
33+
| GET | user::view-account | /user/account |
34+
| PATCH | user::update-account | /user/account |
35+
| POST | user::create-account | /user/account |
36+
| POST | user::request-activate-account | /user/account/activate |
37+
| PATCH | user::activate-account | /user/account/activate/{hash} |
38+
| DELETE | user::delete-account-avatar | /user/account/avatar |
39+
| GET | user::view-account-avatar | /user/account/avatar |
40+
| POST | user::create-account-avatar | /user/account/avatar |
41+
| POST | user::recover-account | /user/account/recover |
42+
| POST | user::create-account-reset-password | /user/account/reset-password |
43+
| GET | user::check-account-reset-password | /user/account/reset-password/{hash} |
44+
| PATCH | user::update-account-reset-password | /user/account/reset-password/{hash} |
45+
| GET | user::list-role | /user/role |
46+
| GET | user::view-role | /user/role/{uuid} |
47+
| DELETE | user::delete-user | /user/{uuid} |
48+
| GET | user::view-user | /user/{uuid} |
49+
| PATCH | user::update-user | /user/{uuid} |
50+
| PATCH | user::activate-user | /user/{uuid}/activate |
51+
| DELETE | user::delete-user-avatar | /user/{uuid}/avatar |
52+
| GET | user::view-user-avatar | /user/{uuid}/avatar |
53+
| POST | user::create-user-avatar | /user/{uuid}/avatar |
54+
| PATCH | user::deactivate-user | /user/{uuid}/deactivate |
55+
+------+----------------+-------------------------------------+-------------------------------------+
56+
57+
```
58+
59+
## Filtering results
60+
61+
The following filters can be applied when displaying the routes list:
62+
63+
* Filter routes by name, using: `-i|--name[=NAME]`
64+
* Filter routes by path, using: `-p|--path[=PATH]`
65+
* Filter routes by method, using: `-m|--method[=METHOD]`
66+
67+
The filters are case-insensitive and can be combined.
68+
69+
Get more help by running this command:
70+
71+
```shell
72+
php ./bin/cli.php route:list --help
73+
```
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Generate a database migration without dropping custom tables
2+
3+
## Usage
4+
5+
Run the following command in your application’s root directory:
6+
7+
```shell
8+
vendor/bin/doctrine-migrations diff
9+
```
10+
11+
If you have mapping modifications, this will create a new migration file under `data/doctrine/migrations/` directory.
12+
Opening the migration file, you will notice that it contains some queries that will drop your `oauth_*` tables because they are unmapped (there is no doctrine entity describing them).
13+
You should delete your latest migration with the DROP queries in it as we will create another one, without the DROP queries in it.
14+
In order to avoid dropping these tables, you need to add a parameter called `filter-expression`.
15+
16+
The command to be executed without dropping these tables looks like this:
17+
18+
On Windows (use double quotes):
19+
20+
```shell
21+
vendor/bin/doctrine-migrations diff --filter-expression="/^(?!oauth_)/"
22+
```
23+
24+
On Linux/macOS (use single quotes):
25+
26+
```shell
27+
vendor/bin/doctrine-migrations diff --filter-expression='/^(?!oauth_)/'
28+
```
29+
30+
## Filtering multiple unmapped table patterns
31+
32+
If your database contains multiple unmapped table groups, then the pattern in `filter-expression` should hold all table prefixes concatenated by pipe character (`|`).
33+
For example, if you need to filter tables prefixed with `foo_` and `bar_`, then the command should look like this:
34+
35+
On Windows:
36+
37+
```shell
38+
vendor/bin/doctrine-migrations diff --filter-expression="/^(?!foo_|bar_)/"
39+
```
40+
41+
On Linux/macOS:
42+
43+
```shell
44+
vendor/bin/doctrine-migrations diff --filter-expression='/^(?!foo_|bar_)/'
45+
```
46+
47+
## Troubleshooting
48+
49+
On Windows, running the command in PowerShell might still add the `DROP TABLE oauth_*` queries to the migration file.
50+
This happens because for PowerShell the caret (`^`) is a special character, so it gets dropped (`"/^(?!oauth_)/"` becomes `"/(?!oauth_)/"` when it reaches your command).
51+
Escaping it will not help either.
52+
In this case, we recommend running the command:
53+
54+
* directly from your IDE
55+
* using `Linux shell`
56+
* from the `Command Prompt`
57+
58+
## Help
59+
60+
You can get more help with this command by running:
61+
62+
```shell
63+
vendor/bin/doctrine-migrations help diff
64+
```
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Generating tokens in Dotkernel API
2+
3+
This is a multipurpose command that allows creating tokens required by different parts of the API.
4+
5+
## Usage
6+
7+
Go to your application's root directory.
8+
9+
Run the token generator command by executing the following command:
10+
11+
```shell
12+
php ./bin/cli.php token:generate <type>
13+
```
14+
15+
Where `<type>` is one of the following:
16+
17+
* [error-reporting](#generate-error-reporting-token)
18+
19+
If you need help using the command, execute the following command:
20+
21+
```shell
22+
php ./bin/cli.php token:generate --help
23+
```
24+
25+
### Generate error reporting token
26+
27+
You can generate an error reporting token by executing the following command:
28+
29+
```shell
30+
php ./bin/cli.php token:generate error-reporting
31+
```
32+
33+
The output should look similar to this:
34+
35+
```text
36+
Error reporting token:
37+
38+
0123456789abcdef0123456789abcdef01234567
39+
```
40+
41+
Copy the generated token.
42+
43+
Open `config/autoload/error-handling.global.php` and paste the copied token as shown below:
44+
45+
```php
46+
return [
47+
...
48+
ErrorReportServiceInterface::class => [
49+
...
50+
'tokens' => [
51+
'0123456789abcdef0123456789abcdef01234567',
52+
],
53+
...
54+
]
55+
]
56+
```
57+
58+
Save and close `config/autoload/error-handling.global.php`.
59+
60+
**Note**:
61+
62+
If your application is NOT in development mode, make sure you clear your config cache by executing:
63+
64+
```shell
65+
php ./bin/clear-config-cache.php
66+
```
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# Authentication
2+
3+
Authentication is the process by which an identity is presented to the application. It ensures that the entity
4+
making the request has the proper credentials to access the API.
5+
6+
**Dotkernel API** identities are delivered to the application from the client through the `Authorization` request.
7+
If it is present, the application tries to find and assign the identity to the application. If it is not presented,
8+
Dotkernel API assigns a default `guest` identity, represented by an instance of the class
9+
`Mezzio\Authentication\UserInterface`.
10+
11+
## Configuration
12+
13+
Authentication in Dotkernel API is built around the `mezzio/mezzio-authentication-oauth2` component and is already
14+
configured out of the box. But if you want to dig more, the configuration is stored in
15+
`config/autoload/local.php` under the `authentication` key.
16+
17+
> You can check the
18+
> [mezzio/mezzio-authentication-oauth2](https://docs.mezzio.dev/mezzio-authentication-oauth2/v1/intro/#configuration)
19+
> configuration part for more info.
20+
21+
## How it works
22+
23+
Dotkernels API authentication system can be used for SPAs (single-page applications), mobile applications, and
24+
simple, token-based APIs. It allows each user of your application to generate API tokens for their accounts.
25+
26+
The authentication happens through the middleware in the `Api\App\Middleware\AuthenticationMiddleware`.
27+
28+
## Database
29+
30+
When you install **Dotkernel API** for the first time, you need to run the migrations and seeders. All the tables
31+
required for authentication are automatically created and populated.
32+
33+
In Dotkernel API, authenticated users come from either the `admin` or the `user` table. We choose to keep the admin
34+
table separated from the users to prevent users of the application from accessing sensitive data, which only the
35+
administrators of the application should access.
36+
37+
The `oauth_clients` table is pre-populated with the default `admin` and `frontend` clients with the same password as
38+
their names (**we recommend you change the default passwords**).
39+
40+
As you guessed each client serves to authenticate `admin` or `user`.
41+
42+
Another table that is pre-populated is the `oauth_scopes` table, with the `api` scope.
43+
44+
### Issuing API Tokens
45+
46+
Token generation in Dotkernel API is done using the `password` `grand_type` scenario, which in this case allows
47+
authentication to an API using the user's credentials (generally a username and password).
48+
49+
The client sends a POST request to the `/security/generate-token` with the following parameters:
50+
51+
- `grant_type` = password.
52+
- `client_id` = column `name` from the `oauth_clients` table
53+
- `client_secret` = column `secret` from the `oauth_clients` table
54+
- `scope` = column `scope` from the `oauth_scopes` table
55+
- `username` = column `identity` from table `admin`/`user`
56+
- `password` = column `password` from table `admin`/`user`
57+
58+
```shell
59+
POST /security/generate-token HTTP/1.1
60+
Accept: application/json
61+
Content-Type: application/json
62+
{
63+
"grant_type": "password",
64+
"client_id": "frontend",
65+
"client_secret": "frontend",
66+
"scope": "api",
67+
"username": "[email protected]",
68+
"password": "dotkernel"
69+
}
70+
```
71+
72+
The server responds with a JSON as follows:
73+
74+
```json
75+
{
76+
"token_type": "Bearer",
77+
"expires_in": 86400,
78+
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
79+
"refresh_token": "def5020087199939a49d0f2f818..."
80+
}
81+
```
82+
83+
Next time when you make a request to the server to an authenticated endpoint, the client should use
84+
the `Authorization` header request.
85+
86+
```shell
87+
GET /users/1 HTTP/1.1
88+
Accept: application/json
89+
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...
90+
```
91+
92+
### Refreshing tokens
93+
94+
Dotkernel API can refresh the access token, based on the expired access token's `refresh_token`.
95+
96+
The clients need to send a `POST` request to the `/security/refresh-token` with the following request
97+
98+
```shell
99+
POST /security/refresh-token HTTP/1.1
100+
Accept: application/json
101+
Content-Type: application/json
102+
{
103+
"grant_type": "refresh_token",
104+
"client_id": "frontend",
105+
"client_secret": "frontend",
106+
"scope": "api",
107+
"refresh_token" : "def5020087199939a49d0f2f818..."
108+
}
109+
```
110+
111+
The server responds with a JSON as follows:
112+
113+
```json
114+
{
115+
"token_type": "Bearer",
116+
"expires_in": 86400,
117+
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
118+
"refresh_token": "def5020087199939a49d0f2f818..."
119+
}
120+
```

0 commit comments

Comments
 (0)