Azure Bot Framework DirectLine v3 Начать разговор - ошибка 403 Запретить - PullRequest
0 голосов
/ 22 января 2019

Я внедряю бота с помощью Azure Bot Framework на свой веб-сайт, используя DirectLine v3.Я пытаюсь начать разговор, как объяснено здесь: https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-start-conversation?view=azure-bot-service-4.0

Когда я отправляю сообщение HTTP, я получаю сообщение об ошибке статуса 403 Запрещено.Может кто-нибудь посоветовать, почему я получаю 403 запрещенных ответа?Я использую это в приложении Angular.

Код для моего сообщения HTTP:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http'
import 'rxjs/Rx';


@Injectable()
export class BotFramework {
    secret = 'SECRET';
    constructor(private httpClient: HttpClient) {}



    authenticate() {
        const headerAuth = new Headers({
            'Authorization': 'Bearer ' + this.secret
        });
        return this.httpClient.post('https://directline.botframework.com/v3/directline/conversations',{
        observe: 'response',
        response: 'json',
        })
        .map(
            (response) => {
                const data = response;
                console.log('Returned response: ' + response);
                return data;
            }
        )
    }
}

Я использую его в компоненте Angular здесь:

 //Azure Bot Framework code goes here
  setTimeout(() => {
    this.botFramework.authenticate()
      .subscribe(
        (authentification: any) => {
          console.log(authentification);
          (error) => console.log('Authentification error: ' + error);
        }
      )
  }, 1000)

Вотнастройка DirectLine в Azure: Azure Bot Framework DirectLine Setup

Вот ошибка в консоли: Console Error

И я получаю это описание ошибки ввкладка «Сеть»: Error message in the Network tab

Таким образом, в сообщении говорится, что отсутствует секрет или токен (у меня есть секрет).Мне кажется, что я что-то не так делаю, когда настраиваю HTTP-пост, так как Azure не может найти мой секрет.Если я правильно предположил, что это ошибка, как правильно отправить сообщение HTTP для Azure, чтобы найти секретный ключ?

Заранее спасибо!

1 Ответ

0 голосов
/ 22 января 2019

ОК, я понял ответ на этот вопрос. Поэтому для проверки подлинности с помощью API-интерфейса Azure Bot Framework DirectLine мне пришлось использовать HTTP-перехватчик в моем приложении Angular. По сути, когда я отправляю запрос HTTP Post, он перехватывается перехватчиком и там добавляется заголовок с секретом авторизации. См. Код перехватчика:

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from 

'@angular/common/http';
import { Observable } from 'rxjs';
import { Injectable } from '@angular/core';
import { BotFramework } from '../Services/botFrameworkDirectLine.service';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
    constructor(private botFramework: BotFramework) {}
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        console.log('Intercepted', req);
        const copiedReq = req.clone({headers: req.headers.set('Authorization',
        this.botFramework.secret)});
        return next.handle(copiedReq);
    }
}

Вот код, где я делаю пост, который почти такой же, как приведенный выше, за исключением секретной переменной:

import { Injectable } from '@angular/core';
import { HttpClient} from '@angular/common/http'
import 'rxjs/Rx';


@Injectable()
export class BotFramework {
    secret = 'Bearer SECRET';
    constructor(private httpClient: HttpClient) {}

    authenticate() {

        return this.httpClient.post(
            'https://directline.botframework.com/v3/directline/conversations',{
        observe: 'body',
        response: 'json',
        })
        .map(
            (response) => {
                const data = response;
                console.log('Returned response: ' + response);
                return data;
            }
        )
    }
}

В файле app.module.ts в моем приложении Angular перехватчик импортируется следующим образом (см. Провайдеры):

@NgModule({


declarations: [
    AppComponent,
    HeaderComponent,
    BreadcrumbComponent,
    TopicComponent,
    HubComponent,
    ComputerHardwareComponent,
    BotComponent,
    PopularTopicsComponent,
    LoginComponent,
    GraphicsCardsComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpClientModule,
    HttpModule
  ],
  providers: [
    KeywordExtractor,
    Translator,
    BotFramework,
    {provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true}
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

В результате я получаю правильный ответ от соединения Azure Bot Service DirectLine:

Response to the HTTP post request

Это дает ответ на мой собственный вопрос, и теперь я могу продолжить разработку своего приложения:)

...