@@ -3,6 +3,7 @@ package main
33import (
44 "crypto"
55 "encoding/base64"
6+ "fmt"
67 "io"
78 "io/ioutil"
89 "net"
@@ -1132,3 +1133,65 @@ func TestClearSingleCookie(t *testing.T) {
11321133
11331134 assert.Equal(t, 1, len(header["Set-Cookie"]), "should have 1 set-cookie header entries")
11341135}
1136+
1137+func TestFindJwtBearerToken(t *testing.T) {
1138+ p := OAuthProxy{CookieName: "oauth2", CookieDomain: "abc"}
1139+ getReq := &http.Request{URL: &url.URL{Scheme: "http", Host: "example.com"}}
1140+
1141+ validToken := "eyJfoobar.eyJfoobar.12345asdf"
1142+ var token string
1143+
1144+ // Bearer
1145+ getReq.Header = map[string][]string{
1146+ "Authorization": {fmt.Sprintf("Bearer %s", validToken)},
1147+ }
1148+
1149+ token, _ = p.findBearerToken(getReq)
1150+ assert.Equal(t, validToken, token)
1151+
1152+ // Basic - no password
1153+ getReq.SetBasicAuth(token, "")
1154+ token, _ = p.findBearerToken(getReq)
1155+ assert.Equal(t, validToken, token)
1156+
1157+ // Basic - sentinel password
1158+ getReq.SetBasicAuth(token, "x-oauth-basic")
1159+ token, _ = p.findBearerToken(getReq)
1160+ assert.Equal(t, validToken, token)
1161+
1162+ // Basic - any username, password matching jwt pattern
1163+ getReq.SetBasicAuth("any-username-you-could-wish-for", token)
1164+ token, _ = p.findBearerToken(getReq)
1165+ assert.Equal(t, validToken, token)
1166+
1167+ failures := []string{
1168+ // Too many parts
1169+ "eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.dGVzdA.dGVzdA.dGVzdA.dGVzdA",
1170+ // Not enough parts
1171+ "eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.dGVzdA.dGVzdA",
1172+ // Invalid encrypted key
1173+ "eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.//////.dGVzdA.dGVzdA.dGVzdA",
1174+ // Invalid IV
1175+ "eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.//////.dGVzdA.dGVzdA",
1176+ // Invalid ciphertext
1177+ "eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.dGVzdA.//////.dGVzdA",
1178+ // Invalid tag
1179+ "eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.dGVzdA.dGVzdA.//////",
1180+ // Invalid header
1181+ "W10.dGVzdA.dGVzdA.dGVzdA.dGVzdA",
1182+ // Invalid header
1183+ "######.dGVzdA.dGVzdA.dGVzdA.dGVzdA",
1184+ // Missing alc/enc params
1185+ "e30.dGVzdA.dGVzdA.dGVzdA.dGVzdA",
1186+ }
1187+
1188+ for _, failure := range failures {
1189+ getReq.Header = map[string][]string{
1190+ "Authorization": {fmt.Sprintf("Bearer %s", failure)},
1191+ }
1192+ _, err := p.findBearerToken(getReq)
1193+ assert.Error(t, err)
1194+ }
1195+
1196+ fmt.Printf("%s", token)
1197+}