PHP code example of nanicas / authentication-library
1. Go to this page and download the library: Download nanicas/authentication-library library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
nanicas / authentication-library example snippets
'providers' => [
\Nanicas\Auth\Frameworks\Laravel\Providers\AppServiceProvider::class,
\Nanicas\Auth\Frameworks\Laravel\Providers\AuthServiceProvider::class,
],
return [
'AUTHENTICATION_OAUTH_CLIENT_ID' => env('NANICAS_AUTHENTICATION_OAUTH_CLIENT_ID'),
'AUTHENTICATION_OAUTH_CLIENT_SECRET' => env('NANICAS_AUTHENTICATION_OAUTH_CLIENT_SECRET'),
'AUTHENTICATION_CLIENT_ID' => env('NANICAS_AUTHENTICATION_CLIENT_ID'),
'AUTHENTICATION_CLIENT_SECRET' => env('NANICAS_AUTHENTICATION_CLIENT_SECRET'),
'AUTHENTICATION_API_URL' => env('NANICAS_AUTHENTICATION_API_URL'),
'AUTHENTICATION_PERSONAL_TOKEN' => env('NANICAS_AUTHENTICATION_PERSONAL_TOKEN'),
'PAINEL_API_URL' => env('NANICAS_PAINEL_API_URL'),
'PAINEL_PERSONAL_TOKEN' => env('NANICAS_PAINEL_PERSONAL_TOKEN'),
'AUTHORIZATION_API_URL' => env('NANICAS_AUTHORIZATION_API_URL'),
'AUTHORIZATION_PERSONAL_TOKEN' => env('NANICAS_AUTHORIZATION_PERSONAL_TOKEN'),
'HARD_CONTRACT_ID' => env('NANICAS_HARD_CONTRACT_ID'),
'SESSION_AUTH_KEY' => 'nanicas_auth',
'SESSION_CLIENT_AUTH_KEY' => 'nanicas_client_auth',
'AUTHORIZATION_RESPONSE_KEY' => 'authorization_response',
'DEFAULT_PERSONAL_TOKEN_MODEL' => Nanicas\Auth\Frameworks\Laravel\Models\PersonalToken::class,
'DEFAULT_AUTHORIZATION_CLIENT' => Nanicas\Auth\Frameworks\Laravel\Services\ThirdPartyAuthorizationService::class,
'DEFAULT_AUTHENTICATION_CLIENT' => Nanicas\Auth\Frameworks\Laravel\Services\ThirdPartyAuthenticationService::class,
'stateless' => false,
'gate' => [
'check_acl_permissions' => false,
]
];
'guards' => [
'web' => [
'driver' => 'custom_session',
'provider' => 'custom',
],
'api' => [
'driver' => 'token',
'provider' => 'custom_token',
],
],
'providers' => [
'custom' => [
'driver' => 'custom_session',
'model' => App\Models\User::class,
],
'custom_token' => [
'driver' => 'custom_token',
'model' => App\Models\User::class,
],
],
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
protected $fillable = [
'id', // É necessário porque a API de autenticação retorna esse atributo e deve ser preenchido
'auth_client.nanicas' => \Nanicas\Auth\Frameworks\Laravel\Http\Middleware\AuthenticateClient::class,
'auth_oauth.nanicas' => \Nanicas\Auth\Frameworks\Laravel\Http\Middleware\AuthenticateOauth::class,
'validate_personal_token.nanicas' => \Nanicas\Auth\Frameworks\Laravel\Http\Middleware\ValidatePersonalToken::class,
'define_contract_by_domain.nanicas' => \Nanicas\Auth\Frameworks\Laravel\Http\Middleware\DefineContractByDomain::class,
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Nanicas\Auth\Contracts\AuthorizationClient;
use Nanicas\Auth\Frameworks\Laravel\Helpers\AuthHelper;
class Authorizate
{
public function handle(Request $request, Closure $next, string ...$guards): Response
{
$request = request();
$config = config(AuthHelper::CONFIG_FILE_NAME);
$token = $request->bearerToken();
$authorizator = app()->make(AuthorizationClient::class);
$response = $authorizator->retrieveByTokenAndContract($token, $config['HARD_CONTRACT_ID']);
if (!$response['status']) {
return response()->json([
'error' => 'Unauthorized',
'message' => (isset($response['message'])) ? $response['message'] : 'Invalid token or contract not found.',
], 401);
}
$request->attributes->set($config['AUTHORIZATION_RESPONSE_KEY'], $response);
return $next($request);
}
}
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Route;
use Nanicas\Auth\Frameworks\Laravel\Helpers\AuthHelper;
Route::middleware(['auth:api', 'authorizate'])->group(function () {
Route::group(['prefix' => 'v1'], function () {
Route::get('/user', function (Request $request) {
try {
Gate::authorize('create', User::class);
$hasPermission = true;
} catch (Exception $e) {
$hasPermission = false;
}
$config = config(AuthHelper::CONFIG_FILE_NAME);
return [
'has_permission' => $hasPermission,
'user' => $request->user(),
'authorization_response' => $request->attributes->get($config['AUTHORIZATION_RESPONSE_KEY']),
];
});
});
});
Illuminate\Auth\Access\AuthorizationException {#323
#message: "This action is unauthorized."
Nanicas\Auth\Exceptions\RequiredAuthorizationResponseToPermissionateException {#296
#message: "Authorization response is
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Route;
use Nanicas\Auth\Contracts\AuthorizationClient;
use Nanicas\Auth\Frameworks\Laravel\Helpers\AuthHelper;
Route::middleware([
'define_contract_by_domain.nanicas',
'auth_oauth.nanicas',
])->get('/user', function () {
$request = request();
$client = app()->make(AuthorizationClient::class);
$permissions = request()->user()->getACLPermissions($request, $client);
dd(array_merge(
AuthHelper::getAuthInfoFromSession($request->session()),
["acl" => $permissions],
));
});
array:7 [▼
"contract" => array:3 [▼
"id" => 6
"subdomain" => "banana"
"domain" => "nanicas.com"
]
"token_type" => "Bearer"
"expires_in" => 7200
"access_token" => "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."
"refresh_token" => "def5020009ccaf2385d538ac0fd7b73dbad..."
"expires_at_datetime" => DateTime @1732924585 {#314 ▼
date: 2024-11-29 23:56:25.910698 UTC (+00:00)
}
"acl" => array:2 [▼
"permissions" => array:3 [▼
0 => "create"
1 => "read"
2 => "update",
3 => "delete",
]
"role" => array:2 [▼
"id" => 2
"name" => "Diretor"
]
]
]
Nanicas\Auth\Exceptions\RequiredContractToPermissionateException {#112
#message: "Contract is
'DEFAULT_AUTHORIZATION_CLIENT' => Nanicas\Auth\Frameworks\Laravel\Services\ThirdPartyAuthorizationService::class,
'DEFAULT_AUTHENTICATION_CLIENT' => Nanicas\Auth\Frameworks\Laravel\Services\ThirdPartyAuthenticationService::class,
use Nanicas\Auth\Frameworks\Laravel\Services\ThirdPartyAuthenticationService as ThirdPartyAuthenticationServiceNanicas;
use Nanicas\Auth\Frameworks\Laravel\Services\ThirdPartyAuthorizationService as ThirdPartyAuthorizationServiceNanicas;
use Nanicas\Auth\Contracts\AuthenticationClient;
use Nanicas\Auth\Contracts\AuthorizationClient;
class YourCustomAuthentication
extends ThirdPartyAuthenticationServiceNanicas
implements AuthenticationClient
{
// ...
}
class YourCustomAuthorization
extends ThirdPartyAuthenticationServiceNanicas
implements AuthorizationClient
{
// ...
}
Description:
Generate a Personal Token
Usage:
personal_token:generate [options] [--] <tokenable_type>
Arguments:
tokenable_type
Options:
--name[=NAME] [default: "access_token"]
--abilities[=ABILITIES] (multiple values allowed)
--expires_at[=EXPIRES_AT]
'AUTHENTICATION_PERSONAL_TOKEN' => env('NANICAS_AUTHENTICATION_PERSONAL_TOKEN'),
'PAINEL_PERSONAL_TOKEN' => env('NANICAS_PAINEL_PERSONAL_TOKEN'),
'AUTHORIZATION_PERSONAL_TOKEN' => env('NANICAS_AUTHORIZATION_PERSONAL_TOKEN'),
php artisan vendor:publish --tag="nanicas_auth:config"
bash
php artisan personal_token:generate <consumer>
bash
php artisan personal_token:generate \
"Authorization\App\Models\User" \
--name="access_token" \
--abilities="read,write" \
--expires_at="2025-12-31 23:59:59"