当前位置:首页 > 文章列表 > Golang > Go问答 > 如何在 golang 中生成具有 8 小时 TTL 的令牌?

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

来源:stackoverflow 2024-02-28 09:45:25 0浏览 收藏

怎么入门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删除
构建 Go 项目时使用/cmd目录结构报错:有多个入口点构建 Go 项目时使用/cmd目录结构报错:有多个入口点
上一篇
构建 Go 项目时使用/cmd目录结构报错:有多个入口点
进程中断: 信号终止
下一篇
进程中断: 信号终止
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 互联网信息服务算法备案系统:如何完成算法备案流程
    互联网信息服务算法备案系统
    了解互联网信息服务算法备案系统,掌握如何进行算法备案的详细步骤和要求,确保您的互联网服务合规运营。
    59次使用
  • SEO标题魔匠AI:高质量学术写作平台,毕业论文生成与优化专家
    魔匠AI
    SEO摘要魔匠AI专注于高质量AI学术写作,已稳定运行6年。提供无限改稿、选题优化、大纲生成、多语言支持、真实参考文献、数据图表生成、查重降重等全流程服务,确保论文质量与隐私安全。适用于专科、本科、硕士学生及研究者,满足多语言学术需求。
    105次使用
  • PPTFake答辩PPT生成器:一键生成高效专业的答辩PPT
    PPTFake答辩PPT生成器
    PPTFake答辩PPT生成器,专为答辩准备设计,极致高效生成PPT与自述稿。智能解析内容,提供多样模板,数据可视化,贴心配套服务,灵活自主编辑,降低制作门槛,适用于各类答辩场景。
    138次使用
  • SEO标题Lovart AI:全球首个设计领域AI智能体,实现全链路设计自动化
    Lovart
    SEO摘要探索Lovart AI,这款专注于设计领域的AI智能体,通过多模态模型集成和智能任务拆解,实现全链路设计自动化。无论是品牌全案设计、广告与视频制作,还是文创内容创作,Lovart AI都能满足您的需求,提升设计效率,降低成本。
    267次使用
  • 美图AI抠图:行业领先的智能图像处理技术,3秒出图,精准无误
    美图AI抠图
    美图AI抠图,依托CVPR 2024竞赛亚军技术,提供顶尖的图像处理解决方案。适用于证件照、商品、毛发等多场景,支持批量处理,3秒出图,零PS基础也能轻松操作,满足个人与商业需求。
    126次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码