我已经使用 Openapi 生成器生成了 dart-dio API 客户端。我用它来登录并获取不记名令牌。然后我称之为:
openapi.setBearerAuth('Authorization', 'Bearer: $token');
我不确定我应该在这里传递什么值 - 这可能是问题所在。当我对安全端点使用 API 调用时,不会发送授权标头,这会导致 401 错误。
openapi
.getSomethingApi
.apiSomethingGet();
但是当我指定标题时它就起作用了:
openapi
.getSomethingApi
.apiSomethingGet(headers: {'Authorization': 'Bearer: $token'});
我是否误解了在 Openapi 生成器生成的 dart-dio 代码中使用授权,或者我犯了什么其他错误?
我也遇到了同样的问题,我认为拦截器没有正确初始化,我最终像下面那样,在初始化 api 实例时将代码放在构造函数中
_apiInstance = openapi.Openapi(
basePathOverride: "your url",
interceptors: [
InterceptorsWrapper(onRequest: (options, handler) {
options.headers['Authorization'] = 'Bearer $token';
return handler.next(options);
})
]);
onRequest方法会在每个请求中触发,因此在token发生变化或更新的事件中,它会获取最新的token
我也遇到了这个问题,深入研究了生成的源代码,发现了一个同样基于拦截器的干净解决方案,但样板较少。
您需要拨打
setBearerAuth
,如下:
openapi.setBearerAuth('bearer', token);
如果您在
constructing
interceptors
实例时未注册任何自定义 openapi
,这应该是开箱即用的。在这种情况下,默认情况下,一个 BearerAuthInterceptor
实例将被添加到所使用的 interceptors
客户端的 Dio
列表中。该拦截器负责修补请求标头:
options.headers['Authorization'] = 'Bearer ${token}';
生成器的 GitHub 源代码 在我研究这个问题时很有帮助。
我按照 @Péter 对 setBearerAuth 的回答,用
'bearer'
而不是 'Bearer'
,但仍然不起作用。
检查我的
BearerAuthInterceptor
代码后(openapi版本3.0.3
):
final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'http' && secure['scheme'] == 'bearer');
我的 api-request.yaml 文件具有安全性:
security:
- Bearer: []
但是我的
openapi.yaml
securitySchemes 设置与“http”不同,它不满足 BearerAuthInterceptor
条件
components:
securitySchemes:
Bearer:
type: someKey // ---> change to http
scheme: bearer // add this line
name: Authorization
更改为
http
并再次运行build_runner
后,我可以在标头中设置承载令牌,这可能取决于您的openapi.yaml
配置。