标签: grpc-web

使用 gRPC-web 安全地公开带有身份验证的 gRPC 服务

我们正在使用 Improbable 的gRPC-Web 库向在浏览器中运行的 Javascript 客户端公开 gRPC 服务(在 Go 中实现)。该服务将与现有的前端 Go 服务并存,该服务托管基于 REST 的 API。现有服务使用基于会话的身份验证对其用户进行身份验证(会话 cookie + 使用双重提交 cookie 的XSRF 保护,这也使用一些每个会话的服务器端状态进行验证)。

前端 Go 服务托管各种 API 端点,这些端点要么在本地处理,要么通过将请求代理到其他服务来实现。所有端点都通过 Gin 中间件处理程序链公开,它实现了上述会话身份验证和 XSRF 保护检查。有人建议我们在这个现有的中间件后面托管 gRPC-Web 的gogrpcproxy 组件,以向全世界公开我们的 gRPC 服务。

我有兴趣确保对传入 gRPC-Web 请求进行身份验证的方法是安全的。已提出以下方法:

  • 基于令牌的身份验证——即在 gRPC 请求元数据中传递承载令牌,这些令牌由后端 gRPC 服务验证。这与在不涉及 gRPC-Web 的情况下对原生 gRPC 调用进行身份验证的身份验证模型相匹配。

    在这个模型中,gRPC-Web 的职责是实现浏览器和服务器之间的传输抽象,并将请求编组到/来自本机 gRPC 表示;身份验证委托给支持的 gRPC 服务。gRPC-Web 代理作为现有 REST API 外部的单独端点托管。

  • 基于会话的身份验证——重用现有的会话身份验证中间件。在此模型中,grpcweb 代理服务器托管在 Gin 处理程序链之后。在接受请求之前,Gin 执行其通常的检查以验证相关 cookie 和 XSRF 标头是否存在。

    这种方法重用了大部分现有的身份验证逻辑。但是,它需要传递 XSRF 标头以确保请求被 Gin 中间件承认。这在当前实现中可以通过设置请求元数据来实现,这是(当前)通过在出站 HTTP …

authentication go grpc grpc-web

7
推荐指数
0
解决办法
3066
查看次数

如何使用 grpc-web 构建 react-redux 应用程序?

我有一个react-redux应用程序,我的团队使用grpc-web。我想知道 - 设计这种系统的最佳方法是什么?

目前的计划是创建 3 个抽象级别:

  1. API模块 -grpc-web客户端周围的promisified包装器
  2. Redux thunks level - 处理 API 的异步动作创建者
  3. React components props - 只会询问组件需要什么

所以components一无所知grpc,他们与动作创建者混在一起,动作创建者一无所知grpc,他们处理一个api模块,并且只有api模块与grpc-web存根一起使用。

我想走这条路的原因:

  • 动作创建器和组件中没有特定于 grpc 的代码
  • 我的基于 Promise 的 API 而不是 grpc-web 的基于回调的 API

我的问题是:

  1. 在 Redux 和 grpc-web 之间有一个抽象级别是个好主意吗?或者最好将这些东西保留在动作创建者的逻辑中?
  2. 有没有我应该想到的通用设计模式?(我在考虑“适配器”)
  3. 承诺grpc-webAPI是个好主意吗?如果是,编写一个函数并即时执行是否是个好主意?
  4. 我可以说我目前的计划是适配器模式吗?
  5. 如果我想使用适配器模式,我是否必须将数据集合的每个元素都映射到我自己的界面?我知道我的组件(可能还有 action-creators)不应该依赖grpc-webAPI,因为这个 API 将来可能会改变

design-patterns reactjs grpc redux grpc-web

7
推荐指数
1
解决办法
717
查看次数

如何在 vue 中使用 grpc-web?

我正在尝试在我的 vue 应用程序中使用 grpc-web 客户端,如下所示:

import Vue from "vue";
import App from "./App.vue";
const { Registration, _ } = require("./identity-service_pb.js");
const {
  IdentityServicePromiseClient
} = require("./identity-service_grpc_web_pb.js");

const identityService = new IdentityServicePromiseClient(
  "http://localhost:9000"
);


const req = new Registration();
req.setGender("male");
req.setInterestList(["A", "B", "C"]);

console.log(req);
console.log(identityService);

identityService.signUp(req, {}).then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.error(error);
});

Vue.config.productionTip = false;

new Vue({
  render: h => h(App)
}).$mount("#app");
Run Code Online (Sandbox Code Playgroud)

当应用程序被编译时,编译器会抱怨:

error  in ./src/identity-service_pb.js

Module Error (from ./node_modules/eslint-loader/index.js):

/home/developer/js/identity-client/src/identity-service_pb.js
   27:1   error  'proto' is not defined      no-undef
   28:50  error …
Run Code Online (Sandbox Code Playgroud)

vue.js grpc grpc-web

6
推荐指数
2
解决办法
5033
查看次数

javascript中来自JSON的Protobuf消息

在 python/C#/C/Go/... 生成的代码中,可以从 JSON 创建一个 proto 消息实例。例如在 Python 中,你可以只做google.protobuf.json_format.Parse(json, message). 我希望 [JavaScript 生成的代码(此处此处)提供相同的内容,但不幸的是,情况并非如此。

我目前正在发送我的 JSONStruct并收到相同的回复。所以现在我想把它打包Struct并取回消息。但我不知道怎么做。

javascript protocol-buffers grpc-web

6
推荐指数
1
解决办法
1304
查看次数

如何在打字稿中使用 google.protobuf.Any 类型?

1.protocol buffer 3文件test.proto

option go_package = ".;apps";
package apps;

message ShardKvMap{
  map<string, google.protobuf.Any> data = 1;
}
Run Code Online (Sandbox Code Playgroud)

2.我使用grpc-web构建.ts文件

protoc -I=$DIR test.proto \
  --js_out=import_style=commonjs,binary:$OUT_DIR \
  --grpc-web_out=import_style=typescript,mode=grpcwebtext:$OUT_DIR
Run Code Online (Sandbox Code Playgroud)

3.如何在typescript中使用google.protobuf.Any类型?

protocol-buffers typescript grpc-web

6
推荐指数
1
解决办法
5888
查看次数

GRPC 客户端错误:14 UNAVAILABLE:无法连接到所有地址

我尝试使用下面的代码测试我的 grpc 客户端连接。我有 .net core grpc 服务器并使用 Node js grpc 客户端进行连接。但出现“无法连接到所有地址”错误。但能够将 .net grpc 服务器连接到 .net grpc 客户端。非常感谢任何帮助。

不确定我是否遗漏了下面 grpc 客户端代码中的任何内容。

'use strict';
//Same as the other projects we import fs for reading documents, in this case employees.js json
const fs = require('fs');

//Importing GRPC and the proto loader
const grpc = require('grpc');
const loader = require('@grpc/proto-loader');



//reads the proto
const packageDefinition = loader.loadSync('Repository.proto', {
  keepCase: false,
  longs: String,
  enums: String, 
  defaults: true,
  oneofs: true
});



//Loads the proto file to …
Run Code Online (Sandbox Code Playgroud)

javascript node.js grpc grpc-web grpc-node

6
推荐指数
1
解决办法
2万
查看次数

Asp.net:不支持“application/grpc-web”

我在浏览器上运行了 Asp.net core 和 gRPC...但现在我得到:

info: Grpc.AspNetCore.Server.ServerCallHandler[2]
  Request content-type of 'application/grpc-web' is not supported.
Run Code Online (Sandbox Code Playgroud)

关于如何追踪这个问题有什么想法吗?

code-first grpc asp.net-core blazor grpc-web

6
推荐指数
2
解决办法
3905
查看次数

TypeError:无法使用 grpc-web 在 React js 应用程序中读取未定义的属性(读取“MethodInfo”)

我正在使用 grpc-web 通过 gRPC 与 java 后端进行通信。我在前端使用 ReactJS,它使用 grpc-web 来解释 protobuffers。

我收到这个奇怪的错误。我的原型是正确的(我使用名为“bloom”的反射工具进行了检查,因此后端很好)这在某种程度上看起来像是我在 ReactJS 中使用的 grpc 库的内部错误。

我收到以下错误:

TypeError: Cannot read properties of undefined (reading 'MethodInfo')

上述错误指向我的原型文件:dashboard_services_grpc_web_pb.js

在这个文件中,它指向这一行

const methodInfo_DashboardService_userLogin = new grpc.web.AbstractClientBase.MethodInfo( ...... );

我很难解决这个问题,因为根据我的理解,grpc.web.AbstractClientBase这是grpc-web.

我还重新安装了我的node_modules,希望这是版本问题,但无济于事。

javascript reactjs grpc grpc-web

6
推荐指数
2
解决办法
4810
查看次数

如何在 grpc-web 中使用 grpc 流?

我想从 React 客户端将文件发送到服务器。我知道为此我应该使用 grpc 流并将文件分割成块。那么,问题是如何将这些块发送到服务器?

grpc grpc-web

5
推荐指数
1
解决办法
7735
查看次数

使用 Contour Kubernetes Ingress 处理 CORS

此时允许 CORS 请求的最佳方法是什么?(鉴于 Contour Ingress 中的 CORS 支持目前在“停车场”中)

我的特定用例是托管一个 GRPC 服务,该服务特使反向代理。方便的是,contour 还支持开箱即用的 grpc-web,我们希望将其用于我们的 Web 服务。

但是,鉴于不支持 CORS,我们无法进行跨域请求。

除了让我们的 Web 应用程序使用与 GRPC api 相同的域外,目前还有其他解决方案可以满足我们的需求吗?

基本上,我们希望Envoy 的配置GRPC Web 示例配置非常相似。

contour kubernetes kubernetes-ingress grpc-web

5
推荐指数
1
解决办法
305
查看次数