Javascript Пользовательские метаданные Rsocket - ошибка RSocket 0x201 (APPLICATION_ERROR): нет обработчика для места назначения - PullRequest
1 голос
/ 23 апреля 2020

Я пытался следовать примеру весенних полетов, но получаю сообщение об ошибке RSocket 0x201 (APPLICATION_ERROR): нет обработчика для пункта назначения.

Метаданные. js

import {JsonSerializer} from 'rsocket-core';

export class Metadata extends Map {

  constructor(json) {
      super();
      if (json != null) {
          for (let [key, value] of json) {
              this.set(key, value);
          }
      }
  }

  toJSON() {
      const result = {};
      for (let [key, value] of this.entries()) {
          result[key] = value;
      }
      return result;
  }

}

Metadata.ROUTE = "route";
Metadata.AUTHENTICATION_BEARER = "message/x.rsocket.authentication.bearer.v0";

export const JsonMetadataSerializer = {

  deserialize(data) {
    if (data == null) {
        return null;
    }
    let json = JsonSerializer.deserialize(data);
    return new Metadata(json);
  },

  serialize(metadata) {
    if (metadata == null) {
        return null;
    }
    let json = metadata.toJSON();
    return JsonSerializer.serialize(json);
  }

};

JsonMetadataSerializer.MIME_TYPE = "application/vnd.spring.rsocket.metadata+json";

Но без Пользовательские метаданные работают отлично.

serializers: {
            data: JsonSerializer,
            metadata: IdentitySerializer
}
metadataMimeType: 'message/x.rsocket.routing.v0',
socket.requestStream({ 
   metadata: String.fromCharCode('greet-stream'.length) + 'greet-stream',
})

Мне нужна помощь с пользовательскими метаданными, чтобы я мог использовать аутентификацию на предъявителя

1 Ответ

0 голосов
/ 01 мая 2020
  1. Загрузите этот проект https://github.com/gregwhitaker/springboot-rsocketjwt-example и запустите все примеры, описанные в README, чтобы убедиться, что все работает правильно.
  2. В проекте application.properties из hello-service добавьте spring.rsocket.server.transport=websocket.
  3. Напишите свой rsocket- js клиент так:
      const host = "127.0.0.1";
      const port = 8080;
      const keepAlive = 60000;
      const lifetime = 180000;
      const dataMimeType = "application/octet-stream";
      const metadataMimeType = MESSAGE_RSOCKET_COMPOSITE_METADATA.string;
      const route = "hello.secure";
      const bearerMimeType = "message/x.rsocket.authentication.bearer.v0";
      const jwtToken =
        "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiYXVkIjoiaGVsbG8tc2VydmljZSIsInNjb3BlIjoiVVNFUiIsImlzcyI6ImhlbGxvLXNlcnZpY2UtZGVtbyIsImV4cCI6MTU4ODMxNzE1OSwianRpIjoiZjQxZmZiYWUtNTk5My00YWU5LTkwMWMtMjU1ODY4NzEyYzZhIn0.VZlQ_rFTtwGukdVMBy_3VUI1EhfdzXLNPkylygUJUbQ";

      const client = new RSocketClient({
        setup: {
          keepAlive,
          lifetime,
          dataMimeType,
          metadataMimeType
        },
        transport: new RSocketWebSocketClient(
          {
            wsCreator: () => new WebSocket("ws://localhost:7000"),
            debug: true
          },
          BufferEncoders
        )
      });

      // Open the connection
      client.connect().then(socket => {
        socket
          .requestResponse({
            data: new Buffer("request-response JWT JS client"),
            metadata: encodeAndAddWellKnownMetadata(
              encodeAndAddCustomMetadata(
                Buffer.alloc(0),
                bearerMimeType,
                Buffer.from(jwtToken)
              ),
              MESSAGE_RSOCKET_ROUTING,
              Buffer.from(String.fromCharCode(route.length) + route)
            )
          })
          .subscribe({
            onComplete: data => {
              console.log("got response with requestResponse");
              const response = data.data.toString();
              console.log(response);
            },
            onError: error => {
              console.log("got error with requestResponse");
              console.error(error);
            },
            onSubscribe: cancel => {
              /* call cancel() to stop onComplete/onError */
            }
          });
      });

В консоли браузера вы должны увидеть:

got response with requestResponse
Hello, request-response JWT JS client! - from secured method
...