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
 	}