tokencache

package module
v1.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 15, 2021 License: Apache-2.0 Imports: 6 Imported by: 0

README

Token Cache

Cache token into memory to reusable. Token are consistent when used concurrently by multiple goroutines.

Go Reference

Usage

Step 1: Create custom token getter, implement TokenGetter interface

Step 2: Init token cache, add to Client

See cache_test or pkg.go.dev for further documentation and examples.

Documentation

Overview

Example
package main

import (
	"context"
	"fmt"
	"time"

	tokencache "github.com/hungdh0x5e/token-cache"
	"golang.org/x/oauth2"
)

// Step 1
type CustomTokenGetter struct{}

// FetchToken implement TokenGetter interface
func (o CustomTokenGetter) FetchToken(ctx context.Context) (*oauth2.Token, error) {

	return nil, nil
}

// Step 2
func NewClient(tokenCache *tokencache.TokenCache) Client {
	return Client{cacheToken: tokenCache}
}

type Client struct {
	cacheToken *tokencache.TokenCache
}

func (c Client) UserInfo(userID string) {
	token, err := c.cacheToken.GetToken(context.Background())
	if err != nil {
		fmt.Printf("UserInfo: %v, err: %v\n", userID, err)
		return
	}
	fmt.Printf("UserInfo: %v, token: %v\n", userID, token.AccessToken)
}

func main() {
	tokenGetter := CustomTokenGetter{}
	client := NewClient(tokencache.NewTokenCache(tokenGetter))

	fmt.Println("Must same access token for all go-routine")
	for i := 1; i < 5; i++ {
		go client.UserInfo(fmt.Sprintf("case_%.2d", i))
		//fmt.Println("==================================")
		//time.Sleep(time.Duration(i) * time.Second)
	}

	time.Sleep(5 * time.Second)
}
Output:

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type ClientCredentialGetter added in v1.0.0

type ClientCredentialGetter struct {
	// contains filtered or unexported fields
}
Example
package main

import (
	"context"
	"fmt"
	"time"

	tokencache "github.com/hungdh0x5e/token-cache"
	"golang.org/x/oauth2/clientcredentials"
)

// Step 2
func NewClient(tokenCache *tokencache.TokenCache) Client {
	return Client{cacheToken: tokenCache}
}

type Client struct {
	cacheToken *tokencache.TokenCache
}

func (c Client) UserInfo(userID string) {
	token, err := c.cacheToken.GetToken(context.Background())
	if err != nil {
		fmt.Printf("UserInfo: %v, err: %v\n", userID, err)
		return
	}
	fmt.Printf("UserInfo: %v, token: %v\n", userID, token.AccessToken)
}

func main() {
	tokenGetter := tokencache.NewClientCredentialGetter(
		clientcredentials.Config{
			ClientID:     "REPLACE_CLIENT_ID",
			ClientSecret: "REPLACE_CLIENT_SECRET",
			Scopes:       []string{""},
			TokenURL:     "https://domain.com/oauth/token",
		},
		nil,
	)

	client := NewClient(tokencache.NewTokenCache(tokenGetter))

	fmt.Println("Must same access token for all go-routine")
	for i := 1; i < 5; i++ {
		go client.UserInfo(fmt.Sprintf("case_%.2d", i))
		//fmt.Println("==================================")
		//time.Sleep(time.Duration(i) * time.Second)
	}

	time.Sleep(5 * time.Second)
}
Output:

func (ClientCredentialGetter) FetchToken added in v1.0.0

func (o ClientCredentialGetter) FetchToken(ctx context.Context) (*oauth2.Token, error)

FetchToken implement TokenGetter interface

type TokenCache

type TokenCache struct {
	// contains filtered or unexported fields
}

func NewTokenCache

func NewTokenCache(getter TokenGetter) *TokenCache

func (*TokenCache) GetToken

func (c *TokenCache) GetToken(ctx context.Context) (*oauth2.Token, error)

GetToken return token from cache or fetch from remote.

type TokenGetter

type TokenGetter interface {
	// FetchToken syncs the token from the remote
	FetchToken(ctx context.Context) (*oauth2.Token, error)
}

TokenGetter is the interface that wraps the FetchToken function.

func NewClientCredentialGetter added in v1.0.0

func NewClientCredentialGetter(config clientcredentials.Config, httpClient *http.Client) TokenGetter

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL