-1

我在 Google App Engine 上有一个简单的 Flask 应用程序,受 Identity-Aware Proxy 保护。身份验证效果很好,但是当我想恢复在 GCP_IAAP_AUTH_TOKEN_XXXXX 中找到的 JWT 时,我只恢复了 GCP_IAP_UID cookie。我努力了

  • google.auht jwt
  • 烧瓶请求cookies
  • 要求

此模块均不检索令牌。浏览器显示我需要的 cookie(显示下面链接的图片),但 Flask 无法捕获它们。欢迎任何想法

  • 我尝试使用 google.auth jwt,但它是空的
  • 我尝试使用 Flask request.cookies 但我只得到 cookie,UID(见代码)
  • 我尝试使用 requests.cookies.RequestsCookieJar(最后一次尝试)但没有 cookie

我的应用程序使用 python 37 运行,以下是要求:

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

在我要验证 jwt的init .py代码下方。

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 ""

最后但至少是一个日志文件:

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''**

浏览器级别的 Cookie

4

1 回答 1

0

事实上,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中找到所需的一切

于 2020-05-03T02:22:11.357 回答