Ошибка соединения IBM Watson WebSocket.Проверка подлинности HTTP не удалась;нет действительных учетных данных - PullRequest
1 голос
/ 04 июня 2019

Я работаю над речевым текстовым веб-приложением, использующим IBM Watson Speech to text API. API выбирается одним нажатием кнопки. Но всякий раз, когда я нажимаю кнопку. Я получаю вышеупомянутую ошибку. Я сохранил мой ключ API и URL в файле .env. Я много пробовал, но продолжаю получать эту ошибку. Пожалуйста, помогите мне, поскольку я новичок во всем этом.

Я получил server.js из репозитория Watson Github

Server.js



'use strict';

/* eslint-env node, es6 */
const env = require('dotenv');
env.config();
const express = require('express');
const app = express();
const AuthorizationV1 = require('watson-developer-cloud/authorization/v1');
const SpeechToTextV1 = require('watson-developer-cloud/speech-to-text/v1');
const TextToSpeechV1 = require('watson-developer-cloud/text-to-speech/v1');
const vcapServices = require('vcap_services');
const cors = require('cors');

// allows environment properties to be set in a file named .env

// on bluemix, enable rate-limiting and force https
if (process.env.VCAP_SERVICES) {
  // enable rate-limiting
  const RateLimit = require('express-rate-limit');
  app.enable('trust proxy'); // required to work properly behind Bluemix's reverse proxy

  const limiter = new RateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 100, // limit each IP to 100 requests per windowMs
    delayMs: 0 // disable delaying - full speed until the max limit is reached
  });

  //  apply to /api/*
  app.use('/api/', limiter);

  // force https - microphone access requires https in Chrome and possibly other browsers
  // (*.mybluemix.net domains all have built-in https support)
  const secure = require('express-secure-only');
  app.use(secure());
}

app.use(express.static(__dirname + '/static'));
app.use(cors())


// token endpoints
// **Warning**: these endpoints should probably be guarded with additional authentication & authorization for production use

// speech to text token endpoint
var sttAuthService = new AuthorizationV1(
  Object.assign(
    {
      iam_apikey: process.env.SPEECH_TO_TEXT_IAM_APIKEY, // if using an RC service
      url: process.env.SPEECH_TO_TEXT_URL ? process.env.SPEECH_TO_TEXT_URL  : SpeechToTextV1.URL
    },
    vcapServices.getCredentials('speech_to_text') // pulls credentials from environment in bluemix, otherwise returns {}
  )
);
app.use('/api/speech-to-text/token', function(req, res) {
  sttAuthService.getToken(function(err, token) {
    if (err) {
      console.log('Error retrieving token: ', err);
      res.status(500).send('Error retrieving token');
      return;
    }
    res.send(token);
  });
});


const port = process.env.PORT || process.env.VCAP_APP_PORT || 3002;
app.listen(port, function() {
  console.log('Example IBM Watson Speech JS SDK client app & token server live at http://localhost:%s/', port);
});

// Chrome requires https to access the user's microphone unless it's a localhost url so
// this sets up a basic server on port 3001 using an included self-signed certificate
// note: this is not suitable for production use
// however bluemix automatically adds https support at https://<myapp>.mybluemix.net
if (!process.env.VCAP_SERVICES) {
  const fs = require('fs');
  const https = require('https');
  const HTTPS_PORT = 3001;

  const options = {
    key: fs.readFileSync(__dirname + '/keys/localhost.pem'),
    cert: fs.readFileSync(__dirname + '/keys/localhost.cert')
  };
  https.createServer(options, app).listen(HTTPS_PORT, function() {
    console.log('Secure server live at https://localhost:%s/', HTTPS_PORT);
  });
}

App.js

import React, {Component} from 'react';
import 'tachyons';
//import WatsonSpeech from 'ibm-watson';
var recognizeMic = require('watson-speech/speech-to-text/recognize-microphone');


class App extends Component {

onListenClick = () => {

  fetch('http://localhost:3002/api/speech-to-text/token')
  .then(function(response) {
      return response.text();
  }).then(function (token) {

    var stream = recognizeMic({
        token: token, // use `access_token` as the parameter name if using an RC service
        objectMode: true, // send objects instead of text
        extractResults: true, // convert {results: [{alternatives:[...]}], result_index: 0} to {alternatives: [...], index: 0}
        format: false // optional - performs basic formatting on the results such as capitals an periods
    });

    stream.on('data', function(data) {
      console.log('error 1')
      console.log(data);
    });
    stream.on('error', function(err) {
        console.log('error 2')
        console.log(err);
    });
    //document.querySelector('#stop').onclick = stream.stop.bind(stream);
  }).catch(function(error) {
      console.log('error 3')
      console.log(error);
  });
}


render() {


return(
   <div>
      <h2  className="tc"> Hello, and welcome to Watson Speech to text api</h2>
      <button onClick={this.onListenClick}>Listen to Microphone</button>
    </div>
  );
}
}

export default App


1 Ответ

0 голосов
/ 05 июня 2019

Так как единственный код, который вы показываете, это получение токена авторизации, то я предполагаю, что именно это вызывает ошибку аутентификации.Я не уверен, сколько лет коду, который вы используете, но механизм, который вы используете, использовался, когда учетными данными службы STT являются ИД пользователя / пароль.Механизм стал ненадежным, когда начали использовать ключи IAM.

Ваш образец все еще использует watson-developer-cloud, но он был заменен ibm-watson.Поскольку перенос кода в ibm-watson потребует значительных переделок, вы можете продолжить использовать watson-developer-cloud.

Если вы придерживаетесь watson-developer-cloud и хотите получитьтокен, с ключом IAM, затем используйте:

  AuthIAMV1 = require('ibm-cloud-sdk-core/iam-token-manager/v1'),

  ...

  tokenService = new AuthIAMV1.IamTokenManagerV1({iamApikey : apikey});

  ...

  tokenService.getToken((err, res) => {
    if (err) {
      ...
    } else {
      token = res;
      ...
    }
  });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...