如何使用下面的 Golang 函数生成一个有效期为 8 小时的令牌?

huangapple go评论82阅读模式
英文:

How do I generate a token with TTL 8h from the below golang function?

问题

我是你的中文翻译助手,以下是你要翻译的内容:

我刚开始学习编程,对于在我的客户端Golang程序中使用令牌生成客户端API函数的源代码一无所知。寻求一些建议。非常感谢。

源代码包:https://pkg.go.dev/github.com/gravitational/teleport/api/client#Client.UpsertToken

函数源代码:

func (c *Client) UpsertToken(ctx context.Context, token types.ProvisionToken) error {
    tokenV2, ok := token.(*types.ProvisionTokenV2)
    if !ok {
        return trace.BadParameter("invalid type %T", token)
    }
    _, err := c.grpc.UpsertToken(ctx, tokenV2, c.callOpts...)
    return trail.FromGRPC(err)
}

我的代码:

package main

import (
    "context"
    "crypto/tls"
    "fmt"
    "log"
    "os"
    "strings"
    "time"

    "github.com/gravitational/teleport/api/client"
    "github.com/gravitational/teleport/api/client/proto"
    "google.golang.org/grpc"
)

// Client是一个gRPC客户端,用于连接到Teleport Auth服务器,可以通过Teleport Web代理或隧道代理在本地或通过SSH进行连接。
//
//该客户端可用于各种Teleport用例,例如以编程方式处理访问请求、与外部工具集成或动态配置Teleport。

type Client struct {
    // c包含客户端的配置值。
    //c Config
    // tlsConfig是成功连接的客户端的*tls.Config。
    tlsConfig *tls.Config
    // dialer是成功连接的客户端的ContextDialer。
    //dialer ContextDialer
    // conn是与auth服务器的grpc连接。
    conn *grpc.ClientConn
    // grpc是auth服务器的gRPC客户端规范。
    grpc proto.AuthServiceClient
    // closedFlag用于指示连接是否已关闭。
    //它是一个指针,允许复制Client结构。
    closedFlag *int32
    // callOpts配置此客户端发出的调用。
    callOpts []grpc.CallOption
}

/*
type ProvisionToken interface {
    Resource
    // SetMetadata设置资源元数据
    SetMetadata(meta Metadata)
    // GetRoles返回将授予令牌用户的teleport角色列表
    //在凭证中
    GetRoles() SystemRoles
    // SetRoles设置teleport角色
    SetRoles(SystemRoles)
    // GetAllowRules返回允许规则列表
    GetAllowRules() []*TokenRule
    // GetAWSIIDTTL返回EC2 IIDs的TTL
    GetAWSIIDTTL() Duration
    // V1返回资源的V1版本
    V2() *ProvisionTokenSpecV2
    // String返回资源的用户友好表示
    String() string
}

type ProvisionTokenSpecV2 struct {
    // Roles是与令牌关联的角色列表,
    //将转换为在发给令牌用户的SSH和X509中的元数据
    Roles                []SystemRole `protobuf:"bytes,1,rep,name=Roles,proto3,casttype=SystemRole" json:"roles"`
    Allow                []*TokenRule `protobuf:"bytes,2,rep,name=allow,proto3" json:"allow,omitempty"`
    AWSIIDTTL            Duration     `protobuf:"varint,3,opt,name=AWSIIDTTL,proto3,casttype=Duration" json:"aws_iid_ttl,omitempty"`
    XXX_NoUnkeyedLiteral struct{}     `json:"-"`
    XXX_unrecognized     []byte       `json:"-"`
    XXX_sizecache        int32        `json:"-"`
}
*/

func main() {
    ctx := context.Background()
    args := os.Args[1:]
    nodeType := ""
    if len(args) > 0 {
        nodeType = args[0]
    }

    proxyAddress := os.Getenv("TELEPORT_PROXY")
    if len(proxyAddress) <= 0 {
        proxyAddress = "proxy.teleport.example.local:443"
    }

    clt, err := client.New(ctx, client.Config{
        Addrs: []string{
            "proxy.teleport.example.local:443",
            "proxy.teleport.example.local:3025",
            "proxy.teleport.example.local:3024",
            "proxy.teleport.example.local:3080",
        },
        Credentials: []client.Credentials{
            client.LoadProfile("", ""),
        },
    })

    if err != nil {
        log.Fatalf("failed to create client: %v", err)
    }

    defer clt.Close()
    ctx, err, token, err2 := clt.UpsertToken(ctx, token)
    if err || err2 != nil {
        log.Fatalf("failed to get tokens: %v", err)
    }
    now := time.Now()
    t := 0
    fmt.Printf("{\"tokens\": [")
    for a, b := range token {
        if strings.Contains(b.GetRoles(), b.Allow().String(), b.GetAWSIIDTTL(), nodeType) {
            if t >= 1 {
                fmt.Printf(",")
            } else {
                panic(err)
            }

            expiry := "never" //time.Now().Add(time.Hour * 8).Unix()
            _ = expiry

            if b.Expiry().Unix() > 0 {
                exptime := b.Expiry().Format(time.RFC822)
                expdur := b.Expiry().Sub(now).Round(time.Second)
                expiry = fmt.Sprintf("%s (%s)", exptime, expdur.String())
            }
            fmt.Printf("\"count\": \"%1d\",", a)
            fmt.Printf(b.Roles(), b.GetAllowRules(), b.GetAWSIIDTTL(), b.GetMetadata().Labels)
        }
    }
}

输出:
创建令牌时出现语法错误。

英文:

I am new in programming and have no idea about using the the token generate client api function in the source code from my client side golang program. Looking for some advice. Thank you so much.

Source code package: https://pkg.go.dev/github.com/gravitational/teleport/api/client#Client.UpsertToken

Function Source Code:

func (c *Client) UpsertToken(ctx context.Context, token types.ProvisionToken) error {
tokenV2, ok := token.(*types.ProvisionTokenV2)
if !ok {
return trace.BadParameter(&quot;invalid type %T&quot;, token)
}
_, err := c.grpc.UpsertToken(ctx, tokenV2, c.callOpts...)
return trail.FromGRPC(err)
}
My code:
package main
import (
&quot;context&quot;
&quot;crypto/tls&quot;
&quot;fmt&quot;
&quot;log&quot;
&quot;os&quot;
&quot;strings&quot;
&quot;time&quot;
&quot;github.com/gravitational/teleport/api/client&quot;
&quot;github.com/gravitational/teleport/api/client/proto&quot;
&quot;google.golang.org/grpc&quot;
)
// Client is a gRPC Client that connects to a Teleport Auth server either
// locally or over ssh through a Teleport web proxy or tunnel proxy.
//
// This client can be used to cover a variety of Teleport use cases,
// such as programmatically handling access requests, integrating
// with external tools, or dynamically configuring Teleport.
type Client struct {
// c contains configuration values for the client.
//c Config
// tlsConfig is the *tls.Config for a successfully connected client.
tlsConfig *tls.Config
// dialer is the ContextDialer for a successfully connected client.
//dialer ContextDialer
// conn is a grpc connection to the auth server.
conn *grpc.ClientConn
// grpc is the gRPC client specification for the auth server.
grpc proto.AuthServiceClient
// closedFlag is set to indicate that the connnection is closed.
// It&#39;s a pointer to allow the Client struct to be copied.
closedFlag *int32
// callOpts configure calls made by this client.
callOpts []grpc.CallOption
}
/*
type ProvisionToken interface {
Resource
// SetMetadata sets resource metatada
SetMetadata(meta Metadata)
// GetRoles returns a list of teleport roles
// that will be granted to the user of the token
// in the crendentials
GetRoles() SystemRoles
// SetRoles sets teleport roles
SetRoles(SystemRoles)
// GetAllowRules returns the list of allow rules
GetAllowRules() []*TokenRule
// GetAWSIIDTTL returns the TTL of EC2 IIDs
GetAWSIIDTTL() Duration
// V1 returns V1 version of the resource
V2() *ProvisionTokenSpecV2
// String returns user friendly representation of the resource
String() string
}
type ProvisionTokenSpecV2 struct {
// Roles is a list of roles associated with the token,
// that will be converted to metadata in the SSH and X509
// certificates issued to the user of the token
Roles                []SystemRole `protobuf:&quot;bytes,1,rep,name=Roles,proto3,casttype=SystemRole&quot; json:&quot;roles&quot;`
Allow                []*TokenRule `protobuf:&quot;bytes,2,rep,name=allow,proto3&quot; json:&quot;allow,omitempty&quot;`
AWSIIDTTL            Duration     `protobuf:&quot;varint,3,opt,name=AWSIIDTTL,proto3,casttype=Duration&quot; json:&quot;aws_iid_ttl,omitempty&quot;`
XXX_NoUnkeyedLiteral struct{}     `json:&quot;-&quot;`
XXX_unrecognized     []byte       `json:&quot;-&quot;`
XXX_sizecache        int32        `json:&quot;-&quot;`
}
*/
func main() {
ctx := context.Background()
args := os.Args[1:]
nodeType := &quot;&quot;
if len(args) &gt; 0 {
nodeType = args[0]
}
proxyAddress := os.Getenv(&quot;TELEPORT_PROXY&quot;)
if len(proxyAddress) &lt;= 0 {
proxyAddress = &quot;proxy.teleport.example.local:443&quot;
}
clt, err := client.New(ctx, client.Config{
Addrs: []string{
&quot;proxy.teleport.example.local:443&quot;,
&quot;proxy.teleport.example.local:3025&quot;,
&quot;proxy.teleport.example.local:3024&quot;,
&quot;proxy.teleport.example.local:3080&quot;,
},
Credentials: []client.Credentials{
client.LoadProfile(&quot;&quot;, &quot;&quot;),
},
})
if err != nil {
log.Fatalf(&quot;failed to create client: %v&quot;, err)
}
defer clt.Close()
ctx, err, token, err2 := clt.UpsertToken(ctx, token)
if err || err2 != nil {
log.Fatalf(&quot;failed to get tokens: %v&quot;, err)
}
now := time.Now()
t := 0
fmt.Printf(&quot;{\&quot;tokens\&quot;: [&quot;)
for a, b := range token {
if strings.Contains(b.GetRoles(), b.Allow().String(), b.GetAWSIIDTTL(), nodeType) {
if t &gt;= 1 {
fmt.Printf(&quot;,&quot;)
} else {
panic(err)
}
expiry := &quot;never&quot; //time.Now().Add(time.Hour * 8).Unix()
_ = expiry
if b.Expiry().Unix() &gt; 0 {
exptime := b.Expiry().Format(time.RFC822)
expdur := b.Expiry().Sub(now).Round(time.Second)
expiry = fmt.Sprintf(&quot;%s (%s)&quot;, exptime, expdur.String())
}
fmt.Printf(&quot;\&quot;count\&quot;: \&quot;%1d\&quot;,&quot;, a)
fmt.Printf(b.Roles(), b.GetAllowRules(), b.GetAWSIIDTTL(), b.GetMetadata().Labels)
}
}
}

Output:
Syntax error instead of creating a token

答案1

得分: 0

你的代码似乎有很多错误。而且,很明显你遇到了语法错误。我确定你在控制台中能看到实际发生语法错误的行号。

请理解Golang的语法,以及如何调用函数以及应该传递多少个参数给这些函数。

在审查了你的代码后,我想指出一些错误。

// 不应该是这样
ctx, err, token, err2 := clt.UpsertToken(ctx, token)

// 而应该是这样
err := clt.UpsertToken(ctx, token)
// UpsertToken() 方法的返回类型是 error,你应该只使用一个变量来接收这个错误。

strings.Contains() 函数接受两个参数,但你传递了四个。

参考这个文档了解 strings.Contains()

你将 t := 0 赋值,并在 for 循环内使用 if 条件进行检查,但从未递增。

参考这个文档了解 fmt.Printf()

参考这个文档了解 函数

删除所有的语法错误,然后再检查你的逻辑。

如果你想看语法错误的示例,请查看这里:https://go.dev/play/p/Hhu48UqlPRF

英文:

It's seems your code have many mistake. And, It's very obvious you are getting syntax error. I am sure you would have got the line number in the console where actually these syntax error has occurred.

Please understand the syntax of Golang and also how to call the functions and how many parameter should i pass to those functions.

There are few mistakes i would like to point out after reviewing your code.

//It shouldn&#39;t be like this
ctx, err, token, err2 := clt.UpsertToken(ctx, token)
//Instead it should be like this
err := clt.UpsertToken(ctx, token)
//The return type of UpsertToken() method is error, you should use only one variable to receive this error.

strings.Contains() function takes two argument but you are passing four.

Refer this document for string.Contains()

You are assigning t := 0 and checking it with if condition inside for loop and never incremented.

Refer this document for fmt.Printf()

Refer this for function

Remove all the syntax error then only your code will run also cross check your logic.

If you want to see the example of syntax error then check here : https://go.dev/play/p/Hhu48UqlPRF

huangapple
  • 本文由 发表于 2022年1月11日 09:22:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/70660618.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定