diff --git a/go/gosdn/core/core.pb.go b/go/gosdn/core/core.pb.go
index c9d9296ca439d300065c3e2760d69ba2f41411d0..2d77912ee311016453a619ebe55fd5400160620c 100644
--- a/go/gosdn/core/core.pb.go
+++ b/go/gosdn/core/core.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc        v3.17.3
 // source: gosdn/core/core.proto
 
 package core
diff --git a/go/gosdn/core/core_grpc.pb.go b/go/gosdn/core/core_grpc.pb.go
index 4a5590f0e25c9c07084459e9a07a4e8080dc7b2b..b87630ee4c18f62ace141ebc7ece9e24eceeaf6d 100644
--- a/go/gosdn/core/core_grpc.pb.go
+++ b/go/gosdn/core/core_grpc.pb.go
@@ -11,7 +11,8 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
 
 // CoreClient is the client API for Core service.
 //
@@ -60,16 +61,23 @@ type CoreServer interface {
 type UnimplementedCoreServer struct {
 }
 
-func (*UnimplementedCoreServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
+func (UnimplementedCoreServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
 }
-func (*UnimplementedCoreServer) Set(context.Context, *SetRequest) (*SetResponse, error) {
+func (UnimplementedCoreServer) Set(context.Context, *SetRequest) (*SetResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Set not implemented")
 }
-func (*UnimplementedCoreServer) mustEmbedUnimplementedCoreServer() {}
+func (UnimplementedCoreServer) mustEmbedUnimplementedCoreServer() {}
 
-func RegisterCoreServer(s *grpc.Server, srv CoreServer) {
-	s.RegisterService(&_Core_serviceDesc, srv)
+// UnsafeCoreServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to CoreServer will
+// result in compilation errors.
+type UnsafeCoreServer interface {
+	mustEmbedUnimplementedCoreServer()
+}
+
+func RegisterCoreServer(s grpc.ServiceRegistrar, srv CoreServer) {
+	s.RegisterService(&Core_ServiceDesc, srv)
 }
 
 func _Core_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
@@ -108,7 +116,10 @@ func _Core_Set_Handler(srv interface{}, ctx context.Context, dec func(interface{
 	return interceptor(ctx, in, info, handler)
 }
 
-var _Core_serviceDesc = grpc.ServiceDesc{
+// Core_ServiceDesc is the grpc.ServiceDesc for Core service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Core_ServiceDesc = grpc.ServiceDesc{
 	ServiceName: "gosdn.core.core",
 	HandlerType: (*CoreServer)(nil),
 	Methods: []grpc.MethodDesc{
diff --git a/go/gosdn/csbi/csbi.pb.go b/go/gosdn/csbi/csbi.pb.go
index 9eceaee278c211b921d9d76134293660ecb7daf3..367fedec6336a632b5c8f5f067806fdd82716af7 100644
--- a/go/gosdn/csbi/csbi.pb.go
+++ b/go/gosdn/csbi/csbi.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc        v3.17.3
 // source: gosdn/csbi/csbi.proto
 
 package csbi
diff --git a/go/gosdn/csbi/csbi_grpc.pb.go b/go/gosdn/csbi/csbi_grpc.pb.go
index e3fa961e8ca86b17b0b87ca2e1a6568c1b5a42a5..583d9e0891d271465fe8300bc886426bba1b3469 100644
--- a/go/gosdn/csbi/csbi_grpc.pb.go
+++ b/go/gosdn/csbi/csbi_grpc.pb.go
@@ -11,7 +11,8 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
 
 // CsbiClient is the client API for Csbi service.
 //
@@ -69,7 +70,7 @@ func (c *csbiClient) Hello(ctx context.Context, in *Syn, opts ...grpc.CallOption
 }
 
 func (c *csbiClient) CreatePlugin(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (Csbi_CreatePluginClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_Csbi_serviceDesc.Streams[0], "/gosdn.csbi.csbi/CreatePlugin", opts...)
+	stream, err := c.cc.NewStream(ctx, &Csbi_ServiceDesc.Streams[0], "/gosdn.csbi.csbi/CreatePlugin", opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -116,25 +117,32 @@ type CsbiServer interface {
 type UnimplementedCsbiServer struct {
 }
 
-func (*UnimplementedCsbiServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
+func (UnimplementedCsbiServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
 }
-func (*UnimplementedCsbiServer) Create(context.Context, *CreateRequest) (*CreateResponse, error) {
+func (UnimplementedCsbiServer) Create(context.Context, *CreateRequest) (*CreateResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
 }
-func (*UnimplementedCsbiServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
+func (UnimplementedCsbiServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
 }
-func (*UnimplementedCsbiServer) Hello(context.Context, *Syn) (*Ack, error) {
+func (UnimplementedCsbiServer) Hello(context.Context, *Syn) (*Ack, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Hello not implemented")
 }
-func (*UnimplementedCsbiServer) CreatePlugin(*CreateRequest, Csbi_CreatePluginServer) error {
+func (UnimplementedCsbiServer) CreatePlugin(*CreateRequest, Csbi_CreatePluginServer) error {
 	return status.Errorf(codes.Unimplemented, "method CreatePlugin not implemented")
 }
-func (*UnimplementedCsbiServer) mustEmbedUnimplementedCsbiServer() {}
+func (UnimplementedCsbiServer) mustEmbedUnimplementedCsbiServer() {}
 
-func RegisterCsbiServer(s *grpc.Server, srv CsbiServer) {
-	s.RegisterService(&_Csbi_serviceDesc, srv)
+// UnsafeCsbiServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to CsbiServer will
+// result in compilation errors.
+type UnsafeCsbiServer interface {
+	mustEmbedUnimplementedCsbiServer()
+}
+
+func RegisterCsbiServer(s grpc.ServiceRegistrar, srv CsbiServer) {
+	s.RegisterService(&Csbi_ServiceDesc, srv)
 }
 
 func _Csbi_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
@@ -230,7 +238,10 @@ func (x *csbiCreatePluginServer) Send(m *Payload) error {
 	return x.ServerStream.SendMsg(m)
 }
 
-var _Csbi_serviceDesc = grpc.ServiceDesc{
+// Csbi_ServiceDesc is the grpc.ServiceDesc for Csbi service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Csbi_ServiceDesc = grpc.ServiceDesc{
 	ServiceName: "gosdn.csbi.csbi",
 	HandlerType: (*CsbiServer)(nil),
 	Methods: []grpc.MethodDesc{
diff --git a/go/gosdn/pnd/pnd.pb.go b/go/gosdn/pnd/pnd.pb.go
index cc4e1f7eb1085456d4873e8e20a4298de766e250..ccec49a059bacab38578116393d361ad122f1de4 100644
--- a/go/gosdn/pnd/pnd.pb.go
+++ b/go/gosdn/pnd/pnd.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc        v3.17.3
 // source: gosdn/pnd/pnd.proto
 
 package pnd
diff --git a/go/gosdn/pnd/pnd_grpc.pb.go b/go/gosdn/pnd/pnd_grpc.pb.go
index edfb8e5cf6c746a774eae0ad8cc50f855dd810ee..4130bc66c584a46584eec8800d88877345ec9c97 100644
--- a/go/gosdn/pnd/pnd_grpc.pb.go
+++ b/go/gosdn/pnd/pnd_grpc.pb.go
@@ -11,7 +11,8 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
 
 // PndClient is the client API for Pnd service.
 //
@@ -71,19 +72,26 @@ type PndServer interface {
 type UnimplementedPndServer struct {
 }
 
-func (*UnimplementedPndServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
+func (UnimplementedPndServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
 }
-func (*UnimplementedPndServer) Set(context.Context, *SetRequest) (*SetResponse, error) {
+func (UnimplementedPndServer) Set(context.Context, *SetRequest) (*SetResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Set not implemented")
 }
-func (*UnimplementedPndServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
+func (UnimplementedPndServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
 }
-func (*UnimplementedPndServer) mustEmbedUnimplementedPndServer() {}
+func (UnimplementedPndServer) mustEmbedUnimplementedPndServer() {}
 
-func RegisterPndServer(s *grpc.Server, srv PndServer) {
-	s.RegisterService(&_Pnd_serviceDesc, srv)
+// UnsafePndServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to PndServer will
+// result in compilation errors.
+type UnsafePndServer interface {
+	mustEmbedUnimplementedPndServer()
+}
+
+func RegisterPndServer(s grpc.ServiceRegistrar, srv PndServer) {
+	s.RegisterService(&Pnd_ServiceDesc, srv)
 }
 
 func _Pnd_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
@@ -140,7 +148,10 @@ func _Pnd_Delete_Handler(srv interface{}, ctx context.Context, dec func(interfac
 	return interceptor(ctx, in, info, handler)
 }
 
-var _Pnd_serviceDesc = grpc.ServiceDesc{
+// Pnd_ServiceDesc is the grpc.ServiceDesc for Pnd service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Pnd_ServiceDesc = grpc.ServiceDesc{
 	ServiceName: "gosdn.pnd.pnd",
 	HandlerType: (*PndServer)(nil),
 	Methods: []grpc.MethodDesc{
diff --git a/go/gosdn/rbac/auth_service.pb.go b/go/gosdn/rbac/auth_service.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..a7d817c8351775596f8d93f4e30c93a6b6bef947
--- /dev/null
+++ b/go/gosdn/rbac/auth_service.pb.go
@@ -0,0 +1,228 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.26.0
+// 	protoc        v3.17.3
+// source: gosdn/rbac/auth_service.proto
+
+package rbac
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	_ "google.golang.org/protobuf/types/descriptorpb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type LoginRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
+	Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
+}
+
+func (x *LoginRequest) Reset() {
+	*x = LoginRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_rbac_auth_service_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LoginRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginRequest) ProtoMessage() {}
+
+func (x *LoginRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_rbac_auth_service_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead.
+func (*LoginRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_rbac_auth_service_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *LoginRequest) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+func (x *LoginRequest) GetPassword() string {
+	if x != nil {
+		return x.Password
+	}
+	return ""
+}
+
+type LoginResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
+}
+
+func (x *LoginResponse) Reset() {
+	*x = LoginResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_rbac_auth_service_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LoginResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginResponse) ProtoMessage() {}
+
+func (x *LoginResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_rbac_auth_service_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LoginResponse.ProtoReflect.Descriptor instead.
+func (*LoginResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_rbac_auth_service_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *LoginResponse) GetAccessToken() string {
+	if x != nil {
+		return x.AccessToken
+	}
+	return ""
+}
+
+var File_gosdn_rbac_auth_service_proto protoreflect.FileDescriptor
+
+var file_gosdn_rbac_auth_service_proto_rawDesc = []byte{
+	0x0a, 0x1d, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x72, 0x62, 0x61, 0x63, 0x2f, 0x61, 0x75, 0x74,
+	0x68, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x0a, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x1a, 0x20, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73,
+	0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x46, 0x0a,
+	0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a,
+	0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73,
+	0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73,
+	0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x32, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73,
+	0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63,
+	0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x4d, 0x0a, 0x0b, 0x41, 0x75, 0x74,
+	0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69,
+	0x6e, 0x12, 0x18, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x4c,
+	0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2a, 0x5a, 0x28, 0x63, 0x6f, 0x64, 0x65,
+	0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e,
+	0x65, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f,
+	0x72, 0x62, 0x61, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_gosdn_rbac_auth_service_proto_rawDescOnce sync.Once
+	file_gosdn_rbac_auth_service_proto_rawDescData = file_gosdn_rbac_auth_service_proto_rawDesc
+)
+
+func file_gosdn_rbac_auth_service_proto_rawDescGZIP() []byte {
+	file_gosdn_rbac_auth_service_proto_rawDescOnce.Do(func() {
+		file_gosdn_rbac_auth_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_rbac_auth_service_proto_rawDescData)
+	})
+	return file_gosdn_rbac_auth_service_proto_rawDescData
+}
+
+var file_gosdn_rbac_auth_service_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_gosdn_rbac_auth_service_proto_goTypes = []interface{}{
+	(*LoginRequest)(nil),  // 0: gosdn.rbac.LoginRequest
+	(*LoginResponse)(nil), // 1: gosdn.rbac.LoginResponse
+}
+var file_gosdn_rbac_auth_service_proto_depIdxs = []int32{
+	0, // 0: gosdn.rbac.AuthService.Login:input_type -> gosdn.rbac.LoginRequest
+	1, // 1: gosdn.rbac.AuthService.Login:output_type -> gosdn.rbac.LoginResponse
+	1, // [1:2] is the sub-list for method output_type
+	0, // [0:1] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_gosdn_rbac_auth_service_proto_init() }
+func file_gosdn_rbac_auth_service_proto_init() {
+	if File_gosdn_rbac_auth_service_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_gosdn_rbac_auth_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LoginRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_rbac_auth_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LoginResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_gosdn_rbac_auth_service_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_gosdn_rbac_auth_service_proto_goTypes,
+		DependencyIndexes: file_gosdn_rbac_auth_service_proto_depIdxs,
+		MessageInfos:      file_gosdn_rbac_auth_service_proto_msgTypes,
+	}.Build()
+	File_gosdn_rbac_auth_service_proto = out.File
+	file_gosdn_rbac_auth_service_proto_rawDesc = nil
+	file_gosdn_rbac_auth_service_proto_goTypes = nil
+	file_gosdn_rbac_auth_service_proto_depIdxs = nil
+}
diff --git a/go/gosdn/rbac/auth_service_grpc.pb.go b/go/gosdn/rbac/auth_service_grpc.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..3677e5f6dace0ac684142478a92fc87201ba1768
--- /dev/null
+++ b/go/gosdn/rbac/auth_service_grpc.pb.go
@@ -0,0 +1,101 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+
+package rbac
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// AuthServiceClient is the client API for AuthService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type AuthServiceClient interface {
+	Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error)
+}
+
+type authServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAuthServiceClient(cc grpc.ClientConnInterface) AuthServiceClient {
+	return &authServiceClient{cc}
+}
+
+func (c *authServiceClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) {
+	out := new(LoginResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.rbac.AuthService/Login", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AuthServiceServer is the server API for AuthService service.
+// All implementations must embed UnimplementedAuthServiceServer
+// for forward compatibility
+type AuthServiceServer interface {
+	Login(context.Context, *LoginRequest) (*LoginResponse, error)
+	mustEmbedUnimplementedAuthServiceServer()
+}
+
+// UnimplementedAuthServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedAuthServiceServer struct {
+}
+
+func (UnimplementedAuthServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Login not implemented")
+}
+func (UnimplementedAuthServiceServer) mustEmbedUnimplementedAuthServiceServer() {}
+
+// UnsafeAuthServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to AuthServiceServer will
+// result in compilation errors.
+type UnsafeAuthServiceServer interface {
+	mustEmbedUnimplementedAuthServiceServer()
+}
+
+func RegisterAuthServiceServer(s grpc.ServiceRegistrar, srv AuthServiceServer) {
+	s.RegisterService(&AuthService_ServiceDesc, srv)
+}
+
+func _AuthService_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(LoginRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AuthServiceServer).Login(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.rbac.AuthService/Login",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AuthServiceServer).Login(ctx, req.(*LoginRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// AuthService_ServiceDesc is the grpc.ServiceDesc for AuthService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var AuthService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "gosdn.rbac.AuthService",
+	HandlerType: (*AuthServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Login",
+			Handler:    _AuthService_Login_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "gosdn/rbac/auth_service.proto",
+}
diff --git a/go/gosdn/southbound/southbound.pb.go b/go/gosdn/southbound/southbound.pb.go
index 216d34115ced38abac1fa95d21286ee37f422eb2..d39e6e45dbe61a7c24023f5252535308663ffcf5 100644
--- a/go/gosdn/southbound/southbound.pb.go
+++ b/go/gosdn/southbound/southbound.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc        v3.17.3
 // source: gosdn/southbound/southbound.proto
 
 package southbound
diff --git a/go/gosdn/transport/transport.pb.go b/go/gosdn/transport/transport.pb.go
index c042703ff9a38ef8c3c997a9a3886ad862dbc8b2..6ef7f23a840f74c2d3ffddff56a6cc3b6d3f5cec 100644
--- a/go/gosdn/transport/transport.pb.go
+++ b/go/gosdn/transport/transport.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc        v3.17.3
 // source: gosdn/transport/transport.proto
 
 package transport
diff --git a/proto/gosdn/rbac/auth_service.proto b/proto/gosdn/rbac/auth_service.proto
new file mode 100644
index 0000000000000000000000000000000000000000..16ebc90c74349a4ce9b7c614403c9b2ee722c594
--- /dev/null
+++ b/proto/gosdn/rbac/auth_service.proto
@@ -0,0 +1,21 @@
+
+syntax = "proto3";
+
+package gosdn.rbac;
+
+option go_package = "code.fbi.h-da.de/danet/api/go/gosdn/rbac";
+
+import "google/protobuf/descriptor.proto";
+
+message LoginRequest {
+    string username = 1;
+    string password = 2;
+}
+
+message LoginResponse { 
+    string access_token = 1;
+}
+
+service AuthService {
+    rpc Login(LoginRequest) returns (LoginResponse) {};
+}
\ No newline at end of file