将 Bearer 令牌与 Openapi 生成器生成的 dart-dio API 客户端一起使用

问题描述 投票:0回答:3

我已经使用 Openapi 生成器生成了 dart-dio API 客户端。我用它来登录并获取不记名令牌。然后我称之为:

openapi.setBearerAuth('Authorization', 'Bearer: $token');

我不确定我应该在这里传递什么值 - 这可能是问题所在。当我对安全端点使用 API 调用时,不会发送授权标头,这会导致 401 错误。

openapi
.getSomethingApi
          .apiSomethingGet();

但是当我指定标题时它就起作用了:

openapi
.getSomethingApi
          .apiSomethingGet(headers: {'Authorization': 'Bearer: $token'});

我是否误解了在 Openapi 生成器生成的 dart-dio 代码中使用授权,或者我犯了什么其他错误?

flutter dart bearer-token openapi-generator dio
3个回答
1
投票

我也遇到了同样的问题,我认为拦截器没有正确初始化,我最终像下面那样,在初始化 api 实例时将代码放在构造函数中

_apiInstance = openapi.Openapi(
        basePathOverride: "your url",
        interceptors: [
          InterceptorsWrapper(onRequest: (options, handler) {
            options.headers['Authorization'] = 'Bearer $token';
            return handler.next(options);
          })
        ]);

onRequest方法会在每个请求中触发,因此在token发生变化或更新的事件中,它会获取最新的token


0
投票

我也遇到了这个问题,深入研究了生成的源代码,发现了一个同样基于拦截器的干净解决方案,但样板较少。

您需要拨打

setBearerAuth
,如下:

openapi.setBearerAuth('bearer', token);

如果您在

constructing
interceptors 实例时未注册任何自定义
openapi
,这应该是开箱即用的。在这种情况下,默认情况下,一个
BearerAuthInterceptor
实例将被添加到所使用的
interceptors
客户端的
Dio
列表中。该拦截器负责修补请求标头:

options.headers['Authorization'] = 'Bearer ${token}';

生成器的 GitHub 源代码 在我研究这个问题时很有帮助。


0
投票

我按照 @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
配置。

© www.soinside.com 2019 - 2024. All rights reserved.