flask - 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.')
解决方案
问题是我在本地主机上运行 OAuth 服务器应用程序以及 OAuth 客户端应用程序。他们会覆盖彼此的 cookie,从而导致
- 客户端应用程序丢失会话状态
- authlib 客户端库未将重定向 URI 发送到令牌端点。
- OAuth 服务器拒绝令牌请求,因为重定向 URI 与身份验证代码请求中的不同。
解决方案是让应用程序在不同的域上运行——在这种情况下,使用 localhost 与 127.0.0.1。
推荐阅读
- c# - 未调用回调
- azure - 如何将数据从 azure 服务总线发送到 Microsoft 通用数据服务存储?
- javascript - 查询对象数组以检查它是否包含 mongoose 中的字符串数组
- bash - 期望在 while/for 循环中不使用 ssh 参数
- android - IOS:Cordova App Crash on Google Map api zoom in ios 11.3 iphone x
- excel - Excel VBA:使用循环过滤(隐藏)数组
- django - 模板未呈现表单
- json - 如何仅在其他属性不存在时才允许一个属性并在 json 模式中允许任何其他属性
- angular - 如何使用我的 CSS 和 Angular 类更改点的颜色
- angularjs - 如何根据 ng-model 值设置输入类型 =“日期”的日期