Генерация JWT в облачной функции Google - python - PullRequest
1 голос
/ 04 марта 2020

Я написал скрипт и загрузил его в GCFunctions. Теперь одна из моих функций использует библиотеку PyJWT для генерации JWT для вызовов API GCP, проблема в том, что я получаю ошибки каждый раз, когда запускаю функцию. Когда я добавил pyjwt в «needs.txt», я получил ошибку: «Алгоритм RS256 не найден», , затем я попытался добавить криптографию (библиотеку шифрования, которую использует pyjwt), а также попробовал pycrypto ( для RS256 регистрируюсь) но все равно ничего. Буду признателен за помощь здесь! даже предложения о других способах аутентификации в вызовах GCP API были бы отличными! Заранее спасибо !!

Редактировать: Кстати, функция работает на Python3 .7

Вот содержимое моего файла require.txt (зависимости)

# Function dependencies, for example:
# package>=version
requests==2.21.0
pycrypto
pyjwt==1.7.1
pyjwt[crypto]
boto3==1.11.13

И это исключение, которое я получаю при попытке добавить pyjwt [crypto] и снова запустить скрипт: введите описание изображения здесь

Ответы [ 3 ]

2 голосов
/ 06 марта 2020

Нашел способ заставить его работать. Размещать его здесь для тех, кто столкнется с этим в будущем ... В конце концов я решил загрузить zip-файл, содержащий файл кода + файл require.txt + учетная запись службы JSON Файл учетных данных и добавил следующие библиотеки в качестве зависимостей (к требованиям .txt): oauth2client, google-api- python -client.

Вот как я это сделал:

from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
import logging

# set the service with the credentials
credentials = GoogleCredentials.from_stream("my_creds.json")
service = discovery.build('compute', 'v1', credentials=credentials)
# block errors printing for 'googleapicliet.discovery'
logging.getLogger('googleapicliet.discovery_cache').setLevel(logging.ERROR)

def main(event, context):
    # Project ID for this request.
    project = '<project_id>'  

    # The name of the zone for this request.
    zone = '<zone>'

    # Name of the instance resource to return.
    instance = '<instance-id>'

    request = service.instances().get(project=project, zone=zone, instance=instance)
    response = request.execute()

    # print only network details of the instance
    print("'{}' Network Details: {}".format(response['name'], response['networkInterfaces'][0]['accessConfigs'][0]))
1 голос
/ 04 марта 2020

Как указано в документации по установке PyJWT , если вы планируете выполнять кодирование или декодирование JWT, вы должны использовать следующую команду pip install, чтобы установить его как необходимый дополнительный компонент вместе с pyjwt:

pip install pyjwt[crypto]

или добавьте pyjwt[crypto] в качестве новой строки в вашем requirements.txt.

0 голосов
/ 05 марта 2020

Поскольку вы хотите использовать API GCP, я бы порекомендовал вам использовать клиентские библиотеки, так как при использовании клиентских библиотек аутентификация управляется самой библиотекой, поэтому нет необходимости управлять безопасностью самостоятельно.

здесь Рекомендуется, чтобы Google не выполнял процесс авторизации явно. и вместо этого используя клиентские библиотеки Propper.

...