使用远程身份验证服务器的 Authlib 令牌验证器
Authlib Token Validator using Remote Authentication Server
Authlib 文档描述了资源服务器如何验证来自实现 BearerTokenValidator 的客户端的 auth_token:
class MyBearerTokenValidator(BearerTokenValidator):
def authenticate_token(self, token_string):
return Token.query.filter_by(access_token=token_string).first()
require_oauth = ResourceProtector()
require_oauth.register_token_validator(MyBearerTokenValidator())
# protecting the resource
@app.route('/user')
@require_oauth()
def user_profile():
user = current_token.user
return jsonify(user)
https://docs.authlib.org/en/stable/flask/2/resource-server.html
此解决方案假定资源服务器可以使用 SQLAlchemy 等 ORM 工具访问身份验证服务器 (AS) 管理令牌的数据库。
就我而言,我无权访问令牌数据库,AS 仅提供一个 REST 自省端点来验证令牌是否有效。
我打算使用请求库并将令牌传递给 AS 以实现我的令牌验证器
class MyBearerTokenValidator(BearerTokenValidator):
def authenticate_token(self, token_string):
resp = requests.post("https://oauth-server-host/oauth/v2/introspection", auth=(id, secret), data={"token": "TK"})
return resp.json()
这是正确的方法还是有更好、更标准的方法?
根据 Authlib 文档,有一个解决此问题的内置方法。感谢@lepture 在评论中指出这一点。
我们可以扩展一个内置的 IntrospectTokenValidator 来实现我们的验证器。
from authlib.oauth2.rfc7662 import IntrospectTokenValidator
from your_project import secrets
class MyIntrospectTokenValidator(IntrospectTokenValidator):
def introspect_token(self, token_string):
url = 'https://example.com/oauth/introspect'
data = {'token': token_string, 'token_type_hint': 'access_token'}
auth = (secrets.internal_client_id, secrets.internal_client_secret)
resp = requests.post(url, data=data, auth=auth)
return resp.json()
然后我们可以将这个令牌验证器注册到资源保护器中:
require_oauth = ResourceProtector()
require_oauth.register_token_validator(MyIntrospectTokenValidator())
来源https://docs.authlib.org/en/latest/specs/rfc7662.html#use-introspection-in-resource-server
Authlib 文档描述了资源服务器如何验证来自实现 BearerTokenValidator 的客户端的 auth_token:
class MyBearerTokenValidator(BearerTokenValidator):
def authenticate_token(self, token_string):
return Token.query.filter_by(access_token=token_string).first()
require_oauth = ResourceProtector()
require_oauth.register_token_validator(MyBearerTokenValidator())
# protecting the resource
@app.route('/user')
@require_oauth()
def user_profile():
user = current_token.user
return jsonify(user)
https://docs.authlib.org/en/stable/flask/2/resource-server.html
此解决方案假定资源服务器可以使用 SQLAlchemy 等 ORM 工具访问身份验证服务器 (AS) 管理令牌的数据库。
就我而言,我无权访问令牌数据库,AS 仅提供一个 REST 自省端点来验证令牌是否有效。
我打算使用请求库并将令牌传递给 AS 以实现我的令牌验证器
class MyBearerTokenValidator(BearerTokenValidator):
def authenticate_token(self, token_string):
resp = requests.post("https://oauth-server-host/oauth/v2/introspection", auth=(id, secret), data={"token": "TK"})
return resp.json()
这是正确的方法还是有更好、更标准的方法?
根据 Authlib 文档,有一个解决此问题的内置方法。感谢@lepture 在评论中指出这一点。
我们可以扩展一个内置的 IntrospectTokenValidator 来实现我们的验证器。
from authlib.oauth2.rfc7662 import IntrospectTokenValidator
from your_project import secrets
class MyIntrospectTokenValidator(IntrospectTokenValidator):
def introspect_token(self, token_string):
url = 'https://example.com/oauth/introspect'
data = {'token': token_string, 'token_type_hint': 'access_token'}
auth = (secrets.internal_client_id, secrets.internal_client_secret)
resp = requests.post(url, data=data, auth=auth)
return resp.json()
然后我们可以将这个令牌验证器注册到资源保护器中:
require_oauth = ResourceProtector()
require_oauth.register_token_validator(MyIntrospectTokenValidator())
来源https://docs.authlib.org/en/latest/specs/rfc7662.html#use-introspection-in-resource-server