首页 > 解决方案 > loginpass OAuth 客户端 - 不正确的行为

问题描述

编辑:似乎存储在 Session 中的 redirect_uri 不会在调用中持续存在。

使用 loginpass 作为 OAuth2 客户端,使用示例仓库中的 authlib 服务器作为 OAuth2 服务器。

在 loginpass 中使用此代码

 bp = create_flask_blueprint(backend, oauth, handle_authorize)
 app.register_blueprint(bp, url_prefix='/{}'.format(backend.OAUTH_NAME))

在授权步骤中,loginpass 向 OAuth2 服务器发送一个 redirect_uri 参数。服务器用验证码响应,然后 loginpass 请求一个令牌,但不包括 redirect_uri。

OAuth2 在处理请求时引发 InvalidRequestError 因为(根据 RFC 6749 的第 4.1.3 节)

redirect_uri 需要,如果“redirect_uri”参数包含在授权请求中,如第 4.1.1 节所述,并且它们的值必须相同。

引发 InvalidRequestError 的服务器代码

 redirect_uri = self.request.redirect_uri
 _redirect_uri = authorization_code.get_redirect_uri()
 original_redirect_uri = _redirect_uri or None
 if redirect_uri != original_redirect_uri:
     raise InvalidRequestError('Invalid "redirect_uri" in request.')

标签: flaskauthlib

解决方案


问题是我在本地主机上运行 OAuth 服务器应用程序以及 OAuth 客户端应用程序。他们会覆盖彼此的 cookie,从而导致

  • 客户端应用程序丢失会话状态
  • authlib 客户端库未将重定向 URI 发送到令牌端点。
  • OAuth 服务器拒绝令牌请求,因为重定向 URI 与身份验证代码请求中的不同。

解决方案是让应用程序在不同的域上运行——在这种情况下,使用 localhost 与 127.0.0.1。


推荐阅读