Updates https://github.com/tailscale/tailscale/issues/3243 Signed-off-by: Denton Gentry <dgentry@tailscale.com>main
parent
6bae55e351
commit
4daba23cd4
@ -0,0 +1 @@ |
||||
get-authkey |
||||
@ -0,0 +1,72 @@ |
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// get-authkey allocates an authkey using an OAuth API client
|
||||
// https://tailscale.com/kb/1215/oauth-clients/ and prints it
|
||||
// to stdout for scripts to capture and use.
|
||||
package main |
||||
|
||||
import ( |
||||
"context" |
||||
"flag" |
||||
"fmt" |
||||
"log" |
||||
"os" |
||||
"strings" |
||||
|
||||
"golang.org/x/oauth2/clientcredentials" |
||||
"tailscale.com/client/tailscale" |
||||
) |
||||
|
||||
func main() { |
||||
// Required to use our client API. We're fine with the instability since the
|
||||
// client lives in the same repo as this code.
|
||||
tailscale.I_Acknowledge_This_API_Is_Unstable = true |
||||
|
||||
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") |
||||
} |
||||
|
||||
baseUrl := os.Getenv("TS_BASE_URL") |
||||
if baseUrl == "" { |
||||
baseUrl = "https://api.tailscale.com" |
||||
} |
||||
|
||||
credentials := clientcredentials.Config{ |
||||
ClientID: clientId, |
||||
ClientSecret: clientSecret, |
||||
TokenURL: baseUrl + "/api/v2/oauth/token", |
||||
Scopes: []string{"device"}, |
||||
} |
||||
|
||||
ctx := context.Background() |
||||
tsClient := tailscale.NewClient("-", nil) |
||||
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) |
||||
} |
||||
Loading…
Reference in new issue