как получить токен JWT из IAP в Flask? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть простое приложение Flask на Google App Engine, защищенное Identity-Aware Proxy. Аутентификация работает хорошо, но я восстанавливаю GCP_IAP_UID cook ie, когда я хочу восстановить JWT, найденный в GCP_IAAP_AUTH_TOKEN_XXXXX. Я пытался

  • google.auht jwt
  • Flask запрашивать куки
  • запросов

Ни один из модулей не получил токен , Браузер показывает файлы cookie, которые мне нужны (покажите изображение, указанное ниже), но Flask не может их поймать. Любая идея приветствуется

  • Я пытаюсь с google.auth jwt, но он пуст
  • Я пытаюсь с Flask request.cookies, но я получаю только на cook ie, UID (см. код)
  • Я пытаюсь выполнить с запросами Вот требования:
    Flask==1.1.2
    Flask-SSLify==0.1.5
    Werkzeug==1.0.1
    google-api-python-client==1.6.0
    google-cloud-storage==1.6.0
    gunicorn==19.10.0
    oauth2client==4.1.3
    six==1.14.0
    requests_toolbelt==0.9.1
    google-auth-httplib2==0.0.3
    ez-setup==0.9
    

    Ниже кода init .py, где я хочу проверить JWT.

    import logging
    
    from flask import Flask, redirect, url_for, request
    from google.auth import jwt
    import requests
    
    user_email = ""
    nickname = ""
    jwtr = ""
    try:
        import googleclouddebugger
        googleclouddebugger.enable()
    except ImportError:
        pass
    
    
    def create_app(config, debug=False, testing=True, config_overrides=None):
        app = Flask(__name__)
        app.config.from_object(config)
    app.debug = debug
    app.testing = testing
    
    if config_overrides:
        app.config.update(config_overrides)
    
    # Configure logging
    # if not app.testing:
    logging.basicConfig(level=logging.INFO)
    
    # Register the Bookshelf CRUD blueprint.
    from .crud import crud
    app.register_blueprint(crud, url_prefix='/app')
    
    # Add a default root route.
    @app.route("/")
    def index():
        jwtr = ""
        # Goto see the log below
        logging.info("1 nb cookies={}".format(len(request.cookies)))
        logging.info("GCP_IAP_UID={}".format(request.cookies.get('GCP_IAP_UID')))
        jar = requests.cookies.RequestsCookieJar()
        logging.info("2 nb cookies={}".format(len(jar)))
        for cle in jar.keys():
            if cle.startswith('GCP_IAAP_AUTH_TOKEN_'):
                jwtr = jar.get(cle)
                logging.info("jwtr={}".format(jwtr))
    
        try:
            user_id, user_email, error_str = validate_iap_jwt_from_app_engine(jwtr,
                    '123456789012', 'xxxxx-yyyy')
            if user_email is not None:
                nickname = user_email.split('@')[0]
                logging.info("nickmane="+nickname + " user_id="+user_id + " user_email=" +
                        user_email)
                return redirect(url_for('crud.index'))
            else:
                return ""
        except (ValueError, requests.exceptions.RequestException) as e:
            logging.error("C'est moche !!{}!!".format(e))
            return ""
    

    Последний, но наименее журнал file:

    INFO:root:1 nb cookies=1
    INFO:root:GCP_IAP_UID=10944565464656564
    INFO:root:2 nb cookies=0
    ERROR:root:**ERROR: JWT validation error Wrong number of segments in token: b''**
    

    Cookies на уровне браузера

1 Ответ

0 голосов
/ 03 мая 2020

на самом деле токен jwt можно найти в заголовке следующим образом:

AUTHORIZATION_HEADER = 'X-Goog-Iap-Jwt-Assertion'
if request.headers.get(AUTHORIZATION_HEADER):
    jwtr = request.headers.get(AUTHORIZATION_HEADER)
    logging.info("header authz={}".format(jwtr))

Вы можете найти все, что вам нужно, в https://cloud.google.com/iap/docs/signed-headers-howto

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...