Есть ли способ асимметрично зашифровать токены доступа, созданные с помощью Laravel Passport? - PullRequest
0 голосов
/ 21 февраля 2019

Я создаю приложение, которое состоит из 3 серверов.Первый - мой Authorization server, второй - мой Database server(API) и, наконец, мой front-end server.Я хочу использовать асимметричное шифрование для шифрования токена доступа, сгенерированного моим Authorization server, чтобы конфиденциальные данные не были скомпрометированы, а также чтобы я мог отправить их на мой API и убедиться, что пользователь, отправляющий запрос, действительно является тем, кто онутверждают, чтоЕсть ли в Laravel Passport что-нибудь, что сделает эту реализацию возможной, или лучше использовать стороннюю библиотеку, такую ​​как PASETO или PHP JWT Framework ??

В настоящее время, когдая делаю запрос к Api

  1. Api вызывает Authorization server для проверки пользователя с использованием токена доступа.
  2. Auth server проверяет пользователя
  3. Если пользователь проверяет, Api доставляет запрошенные нами ресурсы, иначе он возвращает ошибку проверки.

Чего я хочу достичь с помощью асимметричного шифрования, так это исключить вызов моего Auth serverперед каждым запросом к API, и я прочитал, что могу добиться этого с помощью асимметричного шифрования.

1 Ответ

0 голосов
/ 30 апреля 2019

Чтобы решить мою проблему, я использовал библиотеку SimpleJWT для шифрования данных в маркере доступа.Данные зашифрованы в утверждениях JWE.

  $headers = ['alg' => 'RSA-OAEP-256', 'enc' => 'A128CBC-HS256'];
  $access_token = {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
  // Creating JWE object with headers and claims
  $jwe = new \SimpleJWT\JWE($headers, $claims);
  $jwe_encrypted = $jwe->encrypt($foreing_server_public_key);

Позже я расшифрую токен с помощью библиотеки Python JWCrypto .Я подумываю о переходе на Authlib JOSE Guide , потому что у него, кажется, более широкое сообщество и поддержка.

//Decrypting JWE
//Private key should be key pair of public key used to encrypt token
jwetoken.deserialize(jwe_encrypted, key=private_key)
//Validating Signature since passport signs tokens when generating them
jwstoken.verify(auth_public_key)
//Payload should contain encrypted data
data = json.loads(jwstoken.payload.decode())
>> {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
...