WTF是GRPC吗?第1部分:Flutter和Golang中的身份验证和授权。
#go #flutter #mongodb #grpc

问候,技术爱好者,欢迎来到无与伦比的技术旅程! ð今天,我们正在穿越Grpc,Flutter和Golang的迷人世界的过山车骑行,但是随着扭曲,我们以慷慨的幽默感来加注。系好安全带;这将是一个疯狂的旅程!

在我们的三部分系列中,我们将探索GRPC的来龙去脉,flutter and Golang之间令人愉悦的舞蹈,并发现这些技术如何共同创建和谐的应用程序,这些应用程序甚至可以为最甚至最多的人带来微笑斯托克开发人员的脸。

目录

  1. Introduction

  2. Prerequisites

    • 创建项目
    • 设置数据库模型
    • 密码哈希
    • 环境
    • JWT
  3. Basic of Protocol Buffer

    • 服务
    • 消息
  4. Setup Basic Project in Golang

  5. Create Protocol Buffers

  6. Generate Golang code

  7. Authentication in Go

  8. Setup Server and Middleware

  9. Start Server

  10. Flutter Project

  11. Conclusion

快速窥视

  • 第1部分:身份验证和授权
  • 第2部分:自定义扑响通知
  • 第3部分:与GRPC聊天应用程序

GRPC:一个不太无聊的书籍和略带有趣的定义

好吧,是时候让我们的学术眼镜并以一定的想法来解决这个问题。想象一下,您在一个精美的图书馆Soirâe e上,有人问:“祈祷,GRPC是什么?”你笑着回应:

“ Genterfolk,Grpc,代表'Google Remote Procecture Call',就像数字领域的电报系统一样。它是一种精心结构的,高科技的方法,用于不同的程序,可以互相聊天,就像在一天中发送电报,但没有Morse代码。”

“但是等等,还有更多!除了敲击点和破折号,GRPC使用协议缓冲区,就像用秘密间谍代码编码您的消息一样,只是不是那么秘密。这使您的数据紧凑,Zippy,非常适合今天的迅速世界。”

“将其描绘成虚拟的打电话板操作员,将应用程序与Finesse连接起来。此外,它与HTTP/2一起播放,这就像给您的数据提供一个光滑的跑车可以放大,使其超级快。” <<<<<<<<< /p>

“因此,从本质上讲,GRPC是绅士在软件之间达成的协议,确保它们可以有效,可靠地进行沟通,例如两个聊天的茶水饮用的机器人。和谐地交换信息。”

GRPC与休息:API的铁宝座

方面 grpc 休息
协议 使用http/2进行通信。 通常使用http/1.1,但可以使用http/2。
数据序列化 使用协议缓冲区(Protobuf)进行有效的二进制序列化。 使用JSON或XML等人类可读格式。
通信模式 支持一元,服务器流,客户端流和双向流。 主要支持请求响应(http get,post等)。
有效载荷尺寸 由于二进制序列化而导致的有效载荷较小,使其更有效。 由于基于文本的序列化而导致的有效载荷较大。
性能 高性能和低潜伏期,适用于微服务。 由于基于文本的序列化而稍慢一些。
语言不可知论 支持多种编程语言,使其成为多面体。 可以与任何语言一起使用,但不能作为标准化。
代码生成 从Protobuf定义自动生成客户端和服务器代码。 没有用于客户端或服务器的自动代码。
错误处理 使用状态代码和详细的错误消息进行鲁棒错误处理。 通常依赖于HTTP状态代码和自定义错误消息。
工具 由各种库和工具提供了据可查和支持。 广泛支持许多工具和库。

meme1

GRPC的类型

这是GRPC通信的主要类型:

  • Unary RPC(请求响应):这是GRPC通信的最简单形式。客户端向服务器发送一个请求,并等待单个响应。它类似于传统的请求响应互动。

  • 服务器流rpc :在这种模式下,客户端发送了一个请求,但是服务器通过消息流进行了响应。当服务器需要将多个数据推向客户端,例如实时更新时,这很有用。

  • 客户端流rpc :在这里,客户端向服务器发送消息流,并且服务器用单个消息响应。这对于上传大文件等场景可能是有益的。

  • 双向流rpc :在这种类型中,客户端和服务器都可以同时发送消息流。它是互动和实时应用程序(例如聊天或游戏)的理想选择。

meme2

在此中,我们将使用 登录注册 Get-user 请求来探索

先决条件

  • 对Golang,Flutter和MongoDb的基本理解。
  • 兴奋地学习新知识。

Golang的设置基本项目

  • 创建新项目
go mod init <project-name>
  • 安装Mongo软件包
  go get go.mongodb.org/mongo-driver
  • 设置数据库模型

    • 创建软件包db
      • 创建结构以访问数据库
      • 创建新模型user.go
  • 密码哈希:我们将为哈希密码创建功能,并检查密码,切勿将密码存储在简单的文本中。

    • 在root中创建软件包utils
    • 安装所需软件包go get golang.org/x/crypto/bcrypt
    • password.go中创建HashPaswordCheckPassword函数6
  • 设置环境:我们需要很少的环境变量,例如server_addressmongodburljwt_key等。

    • 安装用于加载app.env的Viper软件包。
        go get github.com/spf13/viper
    

有关viper

的更多信息,请阅读更多信息。
  • utils中创建函数以加载app.env文件。
  • 在根文件夹中创建app.env
DB_NAME=grpc 
DB_SOURCE=mongodb://localhost:27017
RPC_SERVER_ADDRESS=0.0.0.0:9090
GIN_MODE=debug
TOKEN_SYMMETRIC_KEY=12345678123456781234567812345678
ACCESS_TOKEN_DURATION=600m

  • 设置JWT:我们需要在几个请求中授权,以便将其访问基于bearer代币的身份验证。
    • 安装必需的JWT软件包
     go get github.com/dgrijalva/jwt-go

注意:不涵盖JWT基础知识。

  • 创建新的软件包令牌并创建界面以创建令牌和验证令牌。

协议缓冲区的基本(.proto)。

  • 服务:GRPC中的一份服务涉及客户端向服务器的单个请求,然后将单个响应发送回客户端。要定义一单位服务,您需要创建一个.proto文件,该文件描述了服务及其使用的消息类型。

  • 消息:消息是一个数据结构,代表客户端和服务器之间发送的信息。它在.proto文件中使用消息关键字定义。这是一个简单的例子:

syntax = "proto3";

message MyRequest {
  string name = 1;
  int32 age = 2;
}

message MyResponse {
  string greeting = 1;
}

在此示例中,我们有两条消息MyRequestMyResponseMyRequest有两个字段,名称和年龄,而MyResponse有一个字段,问候。

  • 从另一个软件包导入数据结构:
import "other_package.proto";

message MyRequest {
  other_package.SomeMessage some_data = 1;
}

为我们的项目创建协议缓冲区:

  • 服务:我们将提供以下名为loginsignupget-user的服务。

  • 创建user.proto,用户对象返回客户端。

syntax = "proto3";

package pb;
option go_package="github.com/djsmk123/server/pb";

message User{
    int32 id=1;
    string username=2;
    string name=3;
}
  • Create rpc_login.proto,它将具有loginrequestMessage和LoginRePonsemessage
syntax="proto3";
package pb;
import "user.proto";
option go_package="github.com/djsmk123/server/pb";


message LoginRequestMessage{
    string username=1;
    string password=2;
}

message LoginResponseMessage{
    User user=1;
    string access_token=2;
}

  • rpc_signup.proto相同:
syntax="proto3";
package pb;
import "user.proto";
option go_package="github.com/djsmk123/server/pb";


message SignupRequestMessage{
    string username=1;
    string password=2;
    string name=3;
}

message SignupResponseMessage{
    User user=1;

}

  • 创建消息rpc_get_user.proto
syntax="proto3";
package pb;
import "user.proto";
option go_package="github.com/djsmk123/server/pb";

message GetUserResponse{
    User user=1;
}
  • 创建服务rpc_services.proto
syntax="proto3";
package pb;
option go_package="github.com/djsmk123/server/pb";
import "empty_request.proto";
import "rpc_get_user.proto";
import "rpc_login.proto";
import "rpc_signup.proto";

service GrpcServerService {
    rpc SignUp(SignupRequestMessage) returns (SignupResponseMessage){};

    rpc login(LoginRequestMessage) returns (LoginResponseMessage){};
    rpc GetUser(EmptyRequest) returns (GetUserResponse) {};
}
message EmptyRequest{

}

生成Golang的代码

  • 在根文件夹中创建pb软件包。
  • 运行命令为Golang生成等效代码
protoc --proto_path=proto --go_out=pb --go_opt=paths=source_relative \
    --go-grpc_out=pb --go-grpc_opt=paths=source_relative \
    proto/*.proto

image 1

创建基本验证功能

  • 创建Auth包:此软件包具有基本功能,例如get-userloginsignuptokenCreation和功能将MongodB Usermodel转换为Grpc user Messsage。

  • auth软件包中创建converter.go

  • 创建token_generate.go生成令牌。

  • 创建login.go

  • 创建signup.go

  • 创建get-user.go

设置服务器和中间软件

  • gapi软件包结构中创建server.go以注册GrpcServiceServer
  • 为了创建用于身份验证的中间软件,我们将需要koude45,但是在此之前,我们将检查是否需要身份验证,我们将列出所有不需要令牌的方法。 >默认情况下注意所有方法对auth令牌都有限制。

创建services.go

  • 创建middlware.go

连接整体并启动服务器

最后,我们将在main.go中转到主要功能,让我们加载环境,连接数据库(mongodb)和runserver。

运行服务器

go run .

测试服务器

您可以使用koude49测试GRPC服务。

  • 开始CLI工具
evans --host localhost --port 9090 -r repl
  • 致电login服务
call login

output1

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • gapi软件包中创建auth.go

再试一次

output2


扑朔迷离的项目

  • 此Flutter应用程序具有四个关键页面:SplashScreenLoginScreenSignUpScreenHomeScreen

  • SplashScreen :此初始页面验证用户的身份验证状态。如果经过身份验证,它将使用get-user服务与gRPC服务器进行通信,并将用户重定向到HomeScreen。否则,它将导航到LoginScreen

  • loginscreen :登录屏幕呈现用于输入usernamepassword的字段。按下提交按钮后,应用程序调用login服务以对用户进行身份验证。 access_token保存到本地存储中,用户被重定向到HomeScreen

  • Ingupscreen :Indupscreen提供了nameusernamepasswordconfirmpassword的字段。当用户提交表单时,应用程序在gRPC服务器上调用signup服务。

注意:不会创建整个UI并剩余登录,但只能覆盖所需的零件。您可以自由创建自己的UI或可以从GitHub repo中参考整体。

设置项目

  • 将以下依赖项添加到pubspec.yaml
  shared_preferences: ^2.2.1
  protobuf: ^3.1.0
  grpc: ^3.2.3
  • 为飞镖安装protoc_plugin
dart pub global activate protoc_plugin
  • .proto文件从服务器复制到Flutter Project的根文件夹。

  • 在飞镖中创建了等效的代码

protoc --proto_path=proto --dart_out=grpc:lib/pb proto/*.proto
  • 创建grpc服务的频道services/grpc_services.dart

  • 为不同方法创建authservices,例如loginsignupget-user

  • 我们只需在演示层中调用功能并添加您自己的逻辑。

输出

1

2

3

4

5

6

感谢您加入我的这次技术冒险!我们希望您能像我一样喜欢在GRPC,Flutter和Golang的旅程中。但是等等,乐趣不会停止!

请继续关注我即将推出的博客,在这里,我将在您的一天中散布更多的幽默,见解和技术巫术。谁知道,在我的下一集中,我们可能只是揭示了用魔杖调试代码的秘密(免责声明:我们实际上不能那样做,但是编码员可以做梦,对吗?)。

在此之前,继续编码,继续笑,并在刷新按钮上准备好这些手指,因为下一个技术故事就在拐角处! ð -

源代码

Github Repo

跟着我