cmd/oauth2.go
author Mikael Berthe <mikael@lilotux.net>
Wed, 10 May 2017 14:11:13 +0200
changeset 113 2e411da68fd3
child 127 2b4d0f198a94
permissions -rw-r--r--
Add oauth2 command Allows OAuth 2.0 authentication interactively or non-interactively. % madonctl oauth2 or % madonctl oauth2 > conffile.yaml Non-interactively: % madonctl oauth2 get-url % madonctl oauth2 code OAUTHCODE (--output/--template can be used as well to customize the output.)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
113
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
// Copyright © 2017 Mikael Berthe <mikael@lilotux.net>
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
//
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
// Licensed under the MIT license.
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
// Please see the LICENSE file is this directory.
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
package cmd
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
import (
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
	"fmt"
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
	"os"
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
	"github.com/pkg/errors"
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
	"github.com/spf13/cobra"
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
	//"github.com/McKael/madonctl/printer"
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
var oauth2Cmd = &cobra.Command{
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
	Use:   "oauth2",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
	Short: "OAuth2 authentication/authorization",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
	Example: `  madonctl oauth2           # Interactive OAuth2 login
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
  madonctl oauth2 get-url   # Display OAuth2 auhtorization URL
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
  madonctl oauth2 code CODE # Enter OAuth2 code`,
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
	RunE: func(cmd *cobra.Command, args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
		return oAuth2Interactive(args)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
	},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
	PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
		// Initialize application; do not log in yet
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
		return madonInit(false)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
	},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
func init() {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
	RootCmd.AddCommand(oauth2Cmd)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
	// Subcommands
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
	oauth2Cmd.AddCommand(oauth2Subcommands...)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
var oauth2Subcommands = []*cobra.Command{
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
	&cobra.Command{
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
		Use:   "get-url",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
		Short: "Get OAuth2 URL",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
		RunE: func(cmd *cobra.Command, args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
			return oAuth2GetURL()
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    45
		},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
	},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
	&cobra.Command{
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
		Use:   "code",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
		Short: "Log in with OAuth2 code",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
		RunE: func(cmd *cobra.Command, args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
			return oAuth2ExchangeCode(args)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
		},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
	},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
func oAuth2GetURL() error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
	// (gClient != nil thanks to PreRun)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
	url, err := gClient.LoginOAuth2("", scopes)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
	if err != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
		return errors.Wrap(err, "OAuth2 authentication failed")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
	fmt.Printf("%s\n", url)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
	return nil
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
func oAuth2ExchangeCode(args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
	// (gClient != nil thanks to PreRun)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
	if len(args) != 1 {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
		return errors.New("wrong usage: code needs 1 argument")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
	code := args[0]
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
	if code == "" {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
		return errors.New("no code entered")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    79
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
	// The code has been set; proceed with token exchange
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
	_, err := gClient.LoginOAuth2(code, scopes)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
	if err != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
		return err
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    85
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
	if gClient.UserToken != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
		errPrint("Login successful.\n")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
		configDump()
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
	return nil
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    92
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
// oAuth2Interactive is the default behaviour
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
func oAuth2Interactive(args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
	// (gClient != nil thanks to PreRun)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
	url, err := gClient.LoginOAuth2("", scopes)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
	if err != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
		return errors.Wrap(err, "OAuth2 authentication failed")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   102
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   103
	fmt.Fprintf(os.Stderr, "Visit the URL for the auth dialog:\n%s\n", url)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
	fmt.Fprintf(os.Stderr, "Enter code: ")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
	var code string
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   106
	if _, err := fmt.Scan(&code); err != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   107
		return err
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   108
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   109
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   110
	if code == "" {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   111
		return errors.New("no code entered")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   112
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   113
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
	// The code has been set; proceed with token exchange
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
	return oAuth2ExchangeCode([]string{code})
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   116
}