मैंने बताए अनुसार लूपबैक 4 में एक OpenAPI कनेक्टर सेट अप किया है। यहां और अनधिकृत अनुरोधों के लिए, यह अच्छी तरह से काम कर रहा है; मैं संबंधित डेटा स्रोत, सेवा और नियंत्रक बनाने में कामयाब रहा। मेरी सेवा जैसी है GeocoderProvider उदाहरण, लेकिन, मान लें, निम्न सेवा इंटरफ़ेस के साथ।

export interface MyExternalService {
  search_stuff(params: {query?: string}): Promise<MyExternalServiceResponse>;
}

export interface MyExternalServiceResponse {
  text: string;
}

मेरे नियंत्रक से, मैं इसे इस तरह से आमंत्रित करता हूं, जहां this.myExternalService इंजेक्शन सेवा है (असंबंधित की तरह, लेकिन क्या लूपबैक बाहरी एपीआई डेटासोर्स से JSON प्रतिक्रिया को स्पष्ट रूप से पार्स कर सकता है?):

  @get('/search')
  async searchStuff(@param.query.string('query') query: string): Promise<void> {
    return JSON.parse(
      (await this.myExternalService.search_stuff({query})).text,
    );
  }

अब, myExternalService.search_stuff से संबंधित बाहरी समापन बिंदु को एक Authorization: Bearer <token> शीर्षलेख की आवश्यकता है, जहां टोकन लूपबैक क्लाइंट द्वारा को भेजा जाता है, अर्थात यह एक स्थिर API कुंजी नहीं है। यह मानते हुए कि मैंने अपनी searchStuff नियंत्रक विधि की पैरामीटर सूची में @param.query.string('token') token: string जोड़ा है, मैं उस टोकन को OpenAPI कनेक्टर को कैसे अग्रेषित कर सकता हूं? यह अंतर्निहित OpenAPI YAML परिभाषा फ़ाइल का प्रासंगिक हिस्सा है:

paths:
  /search:
    get:
      security:
        - Authorization: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResults'
      operationId: search-stuff
components:
  securitySchemes:
    Authorization:
      type: http
      scheme: Bearer
0
sigalor 14 अप्रैल 2020, 15:34

2 जवाब

सबसे बढ़िया उत्तर

मैं अब OpenAPI कनेक्टर के अंतर्निहित execute फ़ंक्शन का उपयोग कर रहा हूं और मैन्युअल रूप से अनुरोध को रोकता हूं (ऑब्जेक्ट जो requestInterceptor को पास किया जाता है, बाद में स्वैगर द्वारा सीधे http मॉड्यूल को पास कर दिया जाता है):

    return JSON.parse(
      (
        await this.myExternalService.execute(
          'search_stuff',
          {query},
          {
            requestInterceptor: (req: {headers: {Authorization: string}}) => {
              req.headers.Authorization = 'Bearer ' + token;
              return req;
            },
          },
        )
      ).text,
    );

मैंने कनेक्टर का वास्तविक execute फ़ंक्शन:

  execute(
    operationId: string,
    parameters: object,
    options: object,
  ): Promise<MyExternalServiceResponse>;

कुछ चीजें जो मैंने पाईं:

  • लूपबैक ओपनएपीआई-आधारित अनुरोध करने के लिए आंतरिक रूप से swagger-client मॉड्यूल का उपयोग करता है।
  • विशेष रूप से स्वैगर के निष्पादन फ़ंक्शन का securities विकल्प एक सुरक्षा परिभाषाएं ऑब्जेक्ट। इसमें कुछ विचित्रताएं हैं जो वास्तव में इसे स्वैगर में भेजती हैं भी।
  • आंतरिक रूप से, स्वैगर अंतिम HTTP अनुरोध बनाता है जिसे यहां इसके सोर्स कोड में। वहां, securities कुंजी का उल्लेख किया गया है, फिर भी वास्तव में अनुरोध के लिए कभी भी इसका उपयोग नहीं किया जाता है। इसका मतलब है कि इसे this.myExternalService.execute के तीसरे पैरामीटर में मैन्युअल रूप से निर्दिष्ट करने से कुछ भी नहीं बदलेगा।

मैं अभी तक इस उत्तर को स्वीकार नहीं करूंगा और मैं अधिक लूपबैक-जैसा दृष्टिकोण खोजने की आशा कर रहा हूं।

0
sigalor 15 अप्रैल 2020, 10:17

बुनियादी प्रमाणीकरण को इंजेक्ट करने के लिए मैंने अपनी सेवा को इस तरह कॉन्फ़िगर किया।

import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core';
import {juggler} from '@loopback/repository';
const SwaggerClient = require('swagger-client');

const config = {
  name: 'jira',
  connector: 'openapi',
  spec: 'swagger-v2.json',
  validate: false,
  httpClient: (request: any) => {
    request.headers["Authorization"] = "Basic " + Buffer.from("test:test").toString('base64');
    return SwaggerClient.http(request);
  },
};

@lifeCycleObserver('datasource')
export class JiraDataSource extends juggler.DataSource
  implements LifeCycleObserver {
  static dataSourceName = 'jira';
  static readonly defaultConfig = config;

  constructor(
    @inject('datasources.config.jira', {optional: true})
    dsConfig: object = config,
  ) {
    super(dsConfig);
  }
}
0
gschaden 19 पद 2020, 23:37
आप गैर-स्थिर टोकन से कैसे निपटते हैं (अर्थात उन्हें कनेक्टर सेवा में भेजने से पहले अनुरोध से उन्हें निकालना)?
 – 
Khalil Khoury
3 जून 2021, 18:19