登录
首页 >  Golang >  Go问答

如何在 golang 中生成具有 8 小时 TTL 的令牌?

来源:stackoverflow

时间:2024-02-28 09:45:25 407浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《如何在 golang 中生成具有 8 小时 TTL 的令牌?》,涉及到,有需要的可以收藏一下

问题内容

我是编程新手,不知道如何在客户端 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)
}

My code:
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 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'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:"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)
        }
    }
}

输出: 语法错误而不是创建令牌


正确答案


看来你的代码有很多错误。而且,很明显你遇到了语法错误。我确信您会在控制台中得到实际发生这些语法错误的行号。

请了解golang的语法以及如何调用函数以及应该向这些函数传递多少参数。

在检查您的代码后,我想指出一些错误。

//It shouldn'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() 函数接受两个参数,但您传递了四个参数。

请参阅此文档以获取 string.Contains()

您正在分配 t := 0 并使用 for 循环内的 if 条件进行检查,而不是 incremented

请参阅此文档以获取 fmt.Printf()

请参阅 function

删除所有语法错误,然后只有您的代码会运行并交叉检查您的逻辑。

如果您想查看语法错误的示例,请查看此处:https://go.dev/play/p/Hhu48UqlPRF

以上就是《如何在 golang 中生成具有 8 小时 TTL 的令牌?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>