python-3.x - 如何在 Grant 类中实现 validate_redirect_uri?
问题描述
我正在尝试从 https://github.com/lepture/flask-oauthlib/tree/master/tests/oauth2/server.py代码库在 Python 中实现 Oauth2 提供程序服务器,但在尝试执行一些重定向 uri 验证自定义时卡住了对于 Oauth2 授权(类型=授权代码)流程。
根据 Oauth2.py,我应该能够添加一个名为 validate_redirect_uri() 的函数来进行我自己的自定义 redirect_uri 验证。但是,在 Grant 类中实现“def validate_redirect_uri(self,redirect_uri):”后,发现当我使用“response_type=code&client_id=confidential&redirect_uri=https%3A%2F%2fXXX.com”等参数发布到 /oauth/authorize 时,它从未被调用过%2Foauth%2Fcallback%3FXXX%3D111&state=11"
我确信该帖子很好(范围已放在 POST 正文中,因此它没有丢失),因为如果我只将 redirect_uri 更改为未自定义的,它就可以了。
在 Server.py 中:
@oauth.grantgetter
def get_grant(client_id, code):
return Grant.query.filter_by(client_id=client_id, code=code).first()
授予类(db.Model):
def validate_redirect_uri(self, redirect_uri):
print('validate_redirect_uri:', redirect_uri,'\n')
if customizedValidateRedirectURI(redirect_uri)!=-1:
print('valid redirect uri')
return True
return False
def delete(self):
db.session.delete(self)
db.session.commit()
return self
在 oauth2.py 中
def confirm_redirect_uri(self, client_id, code, redirect_uri, client,
*args, **kwargs):
"""Ensure client is authorized to redirect to the redirect_uri.
This method is used in the authorization code grant flow. It will
compare redirect_uri and the one in grant token strictly, you can
add a `validate_redirect_uri` function on grant for a customized
validation.
"""
client = client or self._clientgetter(client_id)
log.debug('Confirm redirect uri for client %r and code %r.',
client.client_id, code)
grant = self._grantgetter(client_id=client.client_id, code=code)
if not grant:
log.debug('Grant not found.')
return False
if hasattr(grant, 'validate_redirect_uri'):
return grant.validate_redirect_uri(redirect_uri)
“print('validate_redirect_uri:', redirect_uri,'\n')” 从未被打印,所以函数“validate_redirect_uri(self, redirect_uri)” 从未被调用?
解决方案
通过以下方式解决问题:
MyValidator 类(OAuth2RequestValidator):
def validate_redirect_uri(self, redirect_uri):
print('validate_redirect_uri:', redirect_uri,'\n')
if customizedValidateRedirectURI(redirect_uri)!=-1:
print('valid redirect uri')
return True
return False
def default_provider(app): oauth = OAuth2Provider(app)
跳过一堆@oauth.xxgetter/xxsetter
oauth._validator = MyValidator(
clientgetter=get_client,
tokengetter=get_token,
grantgetter=get_grant,
usergetter=get_user,
tokensetter=set_token,
grantsetter=set_grant,
)
推荐阅读
- python - 在Python2.7的函数中独立执行代码块
- javascript - 页面加载时调用 Javascript onclick 函数
- flutter - Flutter 检查一个类是否包含一个键
- ios - 如何在应用程序中检索小部件大小以根据设备进行预览?
- javascript - 记忆回调函数
- swiftui - 如何处理小部件上的点击手势?
- javascript - nodejs 使用 dbus-daemon 做什么?
- python - 如何在 Python 中对包含 TRUE/FALSE 值的数据集执行聚类?
- python - 为什么 Tkinter 没有垂直填充我的窗口
- haskell - Haskell 中的子集代数数据类型或类型级别集