Home

Awesome

Sample Backend for PHP

This repository contains a sample backend code that demonstrates how to generate a Virgil JWT using the PHP SDK

Do not use this authentication in production. Requests to /virgil-jwt endpoint must be allowed for authenticated users. Use your application authorization strategy.

Installation

Prerequisites

Install dependencies and extensions

$ composer install

Note that required Virgil extensions installs automatically as post install composer script (see composer.json)

Сrypto extensions installation...
----------
Checking input... [OK]
Checking PHP version... [OK]
Checking OS... [OK]
Checking package version... [OK]
Checking PHP extensions directory... [OK]
Checking additional .ini files directory... [OK]
----------
SYSTEM CONFIGURATION:
Crypto version: 
OS (short): Linux
PHP version (short): 7.2
PHP version (full):
PHP 7.2.26 (cli) (built: Dec 22 2019 06:01:52) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.6.1, Copyright (c) 2002-2018, by Derick Rethans
Extensions directory: /usr/lib/php7/modules
Additional .ini files directory: /etc/php7/conf.d /etc/php7/conf.d
----------
Copying vendor/virgil/crypto-wrapper/_extensions/bin/lin/php7.2/vsce_phe_php7.2_v0.15.2.so to the /usr/lib/php7/modules/... [OK]
Copying vendor/virgil/crypto-wrapper/_extensions/bin/lin/php7.2/vscf_foundation_php7.2_v0.15.2.so to the /usr/lib/php7/modules/... [OK]
Copying vendor/virgil/crypto-wrapper/_extensions/bin/lin/php7.2/vscp_pythia_php7.2_v0.15.2.so to the /usr/lib/php7/modules/... [OK]
Copying vendor/virgil/crypto-wrapper/_extensions/bin/lin/php7.2/virgil_crypto.ini file to the /etc/php7/conf.d/virgil_crypto.ini... [OK]
Copying vendor/virgil/crypto-wrapper/_extensions/bin/lin/php7.2/virgil_crypto.ini file to the /etc/php7/conf.d/virgil_crypto.ini... [OK]
----------
STATUS: Restart your webserver (or php-service if available)

Ensure that vscf_foundation_php, vscp_pythia_php, vsce_phe_php extensions is present in command output after composer install

php -m 

Get Virgil Credentials

If you don't have an account yet, sign up for one using your e-mail.

To generate a JWT the following values are required:

Variable NameDescription
APP_KEYPrivate key of your API key that is used to sign the JWTs.
APP_KEY_IDID of your API key. A unique string value that identifies your account in the Virgil Cloud.
APP_IDID of your Virgil Application.

Add Virgil Credentials to the .env

Configure and Run Server

Make sure that ./app/public/ is a public-accessible directory with a index.php file. Also, you need to make a front-controller and rewrite all requests to the index.php file.

More info on how to configure and run a Apache/nginx/hhvm server can be found here.

Specification

/authenticate endpoint

This endpoint is an example of users authentication. It takes user identity and responds with unique token.

POST https://<server_name>/authenticate HTTP/1.1
Content-type: application/json;

{
    "identity": "string"
}

Response:

{
    "authToken": "string"
}
<p><img src="https://raw.githubusercontent.com/VirgilSecurity/sample-backend-php/master/_help/s-4.png" width="60%"></p>

/virgil-jwt endpoint

This endpoint checks whether a user is authorized by an authorization header. It takes user's authToken, finds related user identity and generates a virgilToken (which is JSON Web Token) with this identity in a payload. Use this token to make authorized api calls to Virgil Cloud.

GET https://<server_name>/virgil-jwt HTTP/1.1
Content-type: application/json;
Authorization: Bearer <authToken>

Response:

{
    "virgilToken": "string"
}
<p><img src="https://raw.githubusercontent.com/VirgilSecurity/sample-backend-php/master/_help/s-5.png" width="60%"></p>

Virgil JWT Generation

To generate JWT, you need to use the JwtGenerator class from the SDK.

$privateKeyStr = $_ENV['APP_KEY'];
$apiKeyData = base64_decode($privateKeyStr);

$crypto = new VirgilCrypto();
$privateKey = $crypto->importPrivateKey($apiKeyData);

$appId = $_ENV['APP_ID'];
$apiKeyId = $_ENV['APP_KEY_ID'];
$ttl = 3600;

$jwtGenerator = new SDKJwtGenerator($privateKey->getPrivateKey(), $apiKeyId, $crypto, $appId, $ttl);

$token = $jwtGenerator->generateToken($identity);

$jwt = $token->__toString();

Then you need to provide an HTTP endpoint which will return the JWT with the user's identity as a JSON.

For more details take a look at the JWTGenerator.php file.

License

This library is released under the 3-clause BSD License.

Support

Our developer support team is here to help you. Find out more information on our Help Center.

You can find us on Twitter or send us email support@VirgilSecurity.com.

Also, get extra help from our support team on Slack.