关于Authlib中client_kwargs的audience参数未生效的技术咨询
关于Authlib中client_kwargs不支持audience参数的问题解答
嘿,我刚好对这个问题有点了解,来跟你梳理下:
首先,你遇到的情况是真实存在的——在Authlib的oauth.register或者AUTHLIB_OAUTH_CLIENTS配置里的client_kwargs中设置audience时,这个参数并不会自动被带到授权URI里,只有scope这种标准OAuth2参数能正常生效,而且这个问题在0.12.1和0.13.dev0版本里都存在。
背后的原因
Authlib的客户端框架在处理client_kwargs的时候,默认只认OAuth2规范里定义的标准参数(比如scope),而audience是像Atlassian这类服务商自定义的扩展参数,不在Authlib默认的自动处理范围内,所以配置了也不会生效。
你的临时方案完全可行
你提到的在oauth.atlassian.authorize_redirect里直接传入audience="api.atlassian.com"是目前最直接的解决办法,因为authorize_redirect方法会把你传入的额外参数直接附加到授权请求的URI上。
实现配置化的两种思路
如果你想让audience能像scope一样通过client_kwargs配置生效,有两个方向可以尝试:
- 建议官方优化文档:你可以去Authlib的代码仓库提个Issue,请求官方在文档里明确标注
client_kwargs支持的标准参数列表,同时说明扩展参数的处理方式,这样后续开发者就不会踩同样的坑了。 - 自定义客户端类实现:自己写个客户端类,重写授权URL生成的逻辑,把
audience从client_kwargs里提取出来加到请求参数中,示例代码如下:
然后注册客户端的时候指定这个自定义类:from authlib.integrations.django_client import OAuth2Client class AtlassianCustomClient(OAuth2Client): def create_authorization_url(self, redirect_uri=None, **kwargs): # 从client_kwargs里取出audience audience = self.client_kwargs.get('audience') if audience: kwargs['audience'] = audience # 调用父类方法生成授权URL return super().create_authorization_url(redirect_uri, **kwargs)
这样以后只要在oauth.register( name='atlassian', client_cls=AtlassianCustomClient, client_id='你的客户端ID', client_secret='你的客户端密钥', client_kwargs={ 'scope': 'read:jira-work', 'audience': 'api.atlassian.com' }, # 其他必要配置... )client_kwargs里配置audience,它就会自动被带到授权URI里了。
内容的提问来源于stack exchange,提问作者DrSasha
相关产品推荐
相关产品推荐

