mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-10-31 16:22:03 +01:00 
			
		
		
		
	Even after we remove the deprecated API, we will want to maintain a minimal API for internal use, in order to avoid importing the external tailscale.com/client/tailscale/v2 package. This shim exposes only the necessary parts of the deprecated API for internal use, which gains us the following: 1. It removes deprecation warnings for internal use of the API. 2. It gives us an inventory of which parts we will want to keep for internal use. Updates tailscale/corp#22748 Signed-off-by: Percy Wegmann <percy@tailscale.com>
		
			
				
	
	
		
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright (c) Tailscale Inc & AUTHORS
 | |
| // SPDX-License-Identifier: BSD-3-Clause
 | |
| 
 | |
| // get-authkey allocates an authkey using an OAuth API client
 | |
| // https://tailscale.com/s/oauth-clients and prints it
 | |
| // to stdout for scripts to capture and use.
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"cmp"
 | |
| 	"context"
 | |
| 	"flag"
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| 
 | |
| 	"golang.org/x/oauth2/clientcredentials"
 | |
| 	"tailscale.com/internal/client/tailscale"
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 	reusable := flag.Bool("reusable", false, "allocate a reusable authkey")
 | |
| 	ephemeral := flag.Bool("ephemeral", false, "allocate an ephemeral authkey")
 | |
| 	preauth := flag.Bool("preauth", true, "set the authkey as pre-authorized")
 | |
| 	tags := flag.String("tags", "", "comma-separated list of tags to apply to the authkey")
 | |
| 	flag.Parse()
 | |
| 
 | |
| 	clientID := os.Getenv("TS_API_CLIENT_ID")
 | |
| 	clientSecret := os.Getenv("TS_API_CLIENT_SECRET")
 | |
| 	if clientID == "" || clientSecret == "" {
 | |
| 		log.Fatal("TS_API_CLIENT_ID and TS_API_CLIENT_SECRET must be set")
 | |
| 	}
 | |
| 
 | |
| 	if *tags == "" {
 | |
| 		log.Fatal("at least one tag must be specified")
 | |
| 	}
 | |
| 
 | |
| 	baseURL := cmp.Or(os.Getenv("TS_BASE_URL"), "https://api.tailscale.com")
 | |
| 
 | |
| 	credentials := clientcredentials.Config{
 | |
| 		ClientID:     clientID,
 | |
| 		ClientSecret: clientSecret,
 | |
| 		TokenURL:     baseURL + "/api/v2/oauth/token",
 | |
| 	}
 | |
| 
 | |
| 	ctx := context.Background()
 | |
| 	tsClient := tailscale.NewClient("-", nil)
 | |
| 	tsClient.UserAgent = "tailscale-get-authkey"
 | |
| 	tsClient.HTTPClient = credentials.Client(ctx)
 | |
| 	tsClient.BaseURL = baseURL
 | |
| 
 | |
| 	caps := tailscale.KeyCapabilities{
 | |
| 		Devices: tailscale.KeyDeviceCapabilities{
 | |
| 			Create: tailscale.KeyDeviceCreateCapabilities{
 | |
| 				Reusable:      *reusable,
 | |
| 				Ephemeral:     *ephemeral,
 | |
| 				Preauthorized: *preauth,
 | |
| 				Tags:          strings.Split(*tags, ","),
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	authkey, _, err := tsClient.CreateKey(ctx, caps)
 | |
| 	if err != nil {
 | |
| 		log.Fatal(err.Error())
 | |
| 	}
 | |
| 
 | |
| 	fmt.Println(authkey)
 | |
| }
 |