Make AccessType, ApprovalPrompt and RedirectURL optional.
diff --git a/oauth2.go b/oauth2.go
index c273862..09a104c 100644
--- a/oauth2.go
+++ b/oauth2.go
@@ -108,15 +108,22 @@
// that asks for permissions for the required scopes explicitly.
func (c *Config) AuthCodeURL(state string) (authURL string) {
u := *c.authURL
- q := url.Values{
- "response_type": {"code"},
- "client_id": {c.opts.ClientID},
- "redirect_uri": {c.opts.RedirectURL},
- "scope": {strings.Join(c.opts.Scopes, " ")},
- "state": {state},
- "access_type": {c.opts.AccessType},
- "approval_prompt": {c.opts.ApprovalPrompt},
- }.Encode()
+ vals := url.Values{
+ "response_type": {"code"},
+ "client_id": {c.opts.ClientID},
+ "scope": {strings.Join(c.opts.Scopes, " ")},
+ "state": {state},
+ }
+ if c.opts.AccessType != "" {
+ vals.Set("access_type", c.opts.AccessType)
+ }
+ if c.opts.ApprovalPrompt != "" {
+ vals.Set("approval_prompt", c.opts.ApprovalPrompt)
+ }
+ if c.opts.RedirectURL != "" {
+ vals.Set("redirect_uri", c.opts.RedirectURL)
+ }
+ q := vals.Encode()
if u.RawQuery == "" {
u.RawQuery = q
} else {
@@ -172,11 +179,6 @@
if c.opts.ClientSecret == "" {
return errors.New("A client secret should be provided.")
}
- // TODO(jbd): Are redirect URIs allowed to be a
- // non-value string in the spec?
- if c.opts.RedirectURL == "" {
- return errors.New("A redirect URL should be provided.")
- }
return nil
}
@@ -184,12 +186,17 @@
// to retrieve a new access token.
func (c *Config) exchange(exchangeCode string) (*Token, error) {
token := &Token{}
- err := c.updateToken(token, url.Values{
- "grant_type": {"authorization_code"},
- "redirect_uri": {c.opts.RedirectURL},
- "scope": {strings.Join(c.opts.Scopes, " ")},
- "code": {exchangeCode},
- })
+ vals := url.Values{
+ "grant_type": {"authorization_code"},
+ "code": {exchangeCode},
+ }
+ if len(c.opts.Scopes) != 0 {
+ vals.Set("scope", strings.Join(c.opts.Scopes, " "))
+ }
+ if c.opts.RedirectURL != "" {
+ vals.Set("redirect_uri", c.opts.RedirectURL)
+ }
+ err := c.updateToken(token, vals)
if err != nil {
return nil, err
}