Flask OIDC:oauth2client.client.FlowExchangeError

L.L*_*urg 7 python flask oauth-2.0 openid-connect

问题:

flask-oidc将该scope参数包含到授权代码/访问令牌交换请求中,这毫不奇怪地抛出以下错误:

oauth2client.client.FlowExchangeError:授权代码 access_token 交换请求不支持 invalid_request 范围参数。应向授权请求提供范围参数。

问题:

这是配置问题还是库问题?

我的配置:

  • 烧瓶应用:
app.config.update({
    'DEBUG': True,
    'TESTING': True,
    'SECRET_KEY': 'secret',
    'SERVER_NAME' : 'flask.example.com:8000',
    'OIDC_COOKIE_SECURE': False,
    'OIDC_REQUIRE_VERIFIED_EMAIL': False,
    'OIDC_CALLBACK_ROUTE': '/oidc/callback',
    'OIDC_CLIENT_SECRETS': 'client_secrets.json'
})
oidc = OpenIDConnect(app)
Run Code Online (Sandbox Code Playgroud)
  • client_secrets.json
{
    "web": {
        "auth_uri": "http://openam.example.com:8080/openam/oauth2/realms/root/authorize",
        "issuer": "http://openam.example.com:8080/openam/oauth2/realms/root/",
        "userinfo_uri": "http://openam.example.com:8080/openam/oauth2/realms/root/userinfo",
        "client_id": "MyClientID",
        "client_secret": "password",
        "redirect_uris": [
            "http://flask.example.com:8000/oidc/callback"
        ],
        "token_uri": "http://openam.example.com:8080/openam/oauth2/realms/root/token",
        "token_introspection_uri": "http://openam.example.com:8080/openam/oauth2/realms/root/introspect"
    }
}

Run Code Online (Sandbox Code Playgroud)
  • 访问管理器

对于访问管理器,我使用OpenAM。我按如下方式配置了 OpenAM 客户端代理:

  • 客户端 ID =MyClientID
  • 客户秘密=password
  • 响应类型=code
  • 令牌端点身份验证方法 =client_secret_post
  • 重定向 URI =http://flask.example.com:8000/oidc/callback

上下文:我使用Flask-oidc作为应用程序端的逻辑,使用OpenAM进行身份和访问管理 - 两个应用程序都在 Docker 容器中运行。使用简单的curl命令时,我可以检索授权授予以及身份验证令牌(授予类型:授权代码授予)。但是,使用上述库,登录 OpenAM 并向应用程序授予授权(端点“oauth2/authorize”)后,flask-oidc 会发送以下 GET 请求:

GET /oidc/callback?code=<some code> \
&scope=openid%20email \
&iss=http%3A%2F%2Fopenam.example.com%3A8080%2Fopenam%2Foauth2 \
&state=<some state> \
&client_id=MyClientID
Run Code Online (Sandbox Code Playgroud)

这导致了上面提到的错误。

bar*_*ich 2

虽然这并不能直接回答问题,但我能找到的最佳答案是使用 pyJWT 或 oauthlib 而不是使用flask-oidc。我发现 pyjwt 在大多数方面都非常简单,这里有一个很棒的教程:

使用 Flask 请求 Oauthlib 和 pyjwt 进行 SSO

我不确定这一点,但由于该错误是由 oauth2client 而不是flask-oidc 生成的,因此该错误实际上可能与已弃用的 oathlib2clientlib 有关。

有一个详细的请求将整个 Flask-oidc 项目标记为已弃用,但该请求是在 Flask-oidc 项目停止维护几年后提出的。我希望有一天 Flask 能够从他们的网站上删除这个链接,因为认为它是 Flask 的主要部分是一种误导。