帮助开发人员构建实现操作提供程序规范的服务的工具。
globus-action-provider-tools的Python项目详细描述
这是一个实验性的、不受支持的工具包,可以帮助开发人员构建用于globus自动化流的操作提供程序。
由于这是实验性的,因此不支持或提供对该包的任何类型的使用。它的出版是为了便于在那些计划将它用于其预期、实验和目的的人之间分发。
工具包组件
此工具包提供两个主要组件:
- 身份验证帮助程序,使验证globus身份验证令牌和确定是否应授权给定请求变得更容易
- 一个OpenAPI v3 specification和相关的帮助程序,可用于验证传入请求和验证操作提供程序生成的响应。本文档还定义了rest api必须支持的接口,以使其作为操作提供程序发挥作用。
安装
安装是通过pypi使用的,例如:pip install globus-action-provider-tools。
用法
身份验证
身份验证帮助程序可以在操作提供程序中使用,如下所示:
fromglobus_action_provider_tools.authenticationimportTokenChecker# You will need to register a client and scope(s) in Globus Auth# Then initialize a TokenChecker instance for your provider:checker=TokenChecker(client_id='YOUR_CLIENT_ID',client_secret='YOUR_CLIENT_SECRET',expected_scopes=['https://auth.globus.org/scopes/YOUR_SCOPES_HERE'],expected_audience='YOUR_CLIENT_NAME',)
(预期的观众在不久的将来应该是不必要的)
当请求进入时,使用令牌检查器从http授权头验证访问令牌。
access_token=request.headers['Authorization'].replace('Bearer ','')auth_state=checker.check_token(access_token)
authState有几个属性和方法,可以使您更容易地决定是否允许请求继续:
# This user's Globus identities:auth_state.identities# frozenset({'urn:globus:auth:identity:9d437146-f150-42c2-be88-9d625d9e7cf9',# 'urn:globus:auth:identity:c38f015b-8ad9-4004-9160-754b309b5b33',# 'urn:globus:auth:identity:ffb5652b-d418-4849-9b57-556656706970'})# Groups this user is a member of:auth_state.groups# frozenset({'urn:globus:groups:id:606dbaa9-3d57-44b8-a33e-422a9de0c712',# 'urn:globus:groups:id:d2ff42bc-c708-460f-9e9b-b535c3776bdd'})
您会注意到组和标识都被表示为字符串,明确地表示它们所表示的实体类型。这使得在您希望使用包含所有身份验证的单个集的情况下,可以轻松地合并两个集而不发生冲突:
all_principals=auth_state.identities.union(auth_state.groups)
authstate对象还提供了一个helper方法,check_authorization()用于帮助您测试是否应授权请求:
resource_allows=['urn:globus:auth:identity:c38f015b-8ad9-4004-9160-754b309b5b33']auth_state.check_authorization(resource_allows)# True
此方法还接受两个特殊的字符串值'public'和'all_authenticated_users',以及允许使用它们的关键字参数:
resource_allows=['public']auth_state.check_authorization(resource_allows,allow_public=True)# Trueresource_allows=['all_authenticated_users']auth_state.check_authorization(resource_allows,allow_all_authenticated_users=True)# True
缓存
<>为了避免对Globus AUTs过度征税,默认情况下,{TT4}$将缓存标识和组成员资格30秒。当您第一次实例化TokenChecker()时,缓存被初始化。您只需要为应用程序创建一个tokenchecker实例,然后就可以重新使用它来检查每个新的令牌。如果尝试创建多个实例,可能会出现异常:
>;dogpile.cache.exception.RegionAlreadyConfigured: This region is already configured
因为它正在尝试重新初始化已设置的缓存。
验证
如上所述,有一个针对操作提供程序api的openapi v3规范。您可以使用任何接受OpenAPIv3的工具来验证对您的服务的请求和响应,但是这个工具包提供了一些使用OpenAPIcore库预先配置的验证器。
fromglobus_action_provider_tools.validationimportrequest_validator,response_validator# Validating a requestresult=request_validator.validate(request)# Or a response:result=response_validator.validate(request,response)# raise errors if invalidresult.raise_for_errors()# or get list of errorserrors=result.errors
请注意,传递给验证器的request和response对象必须符合BaseOpenAPI请求和响应接口。如果使用flask,可以使用provided wrappers,但是如果使用不同的web框架,则需要编写自己的小包装类。