Skip to content

Commit 1291187

Browse files
Merge pull request #16894 from mrogers950/token-endpoint-test
Automatic merge from submit-queue (batch tested with PRs 16667, 16796, 16960, 16965, 16894). Add integration test for the request token endpoints fixes #16146
2 parents 867982b + 47ea994 commit 1291187

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package integration
2+
3+
import (
4+
"bytes"
5+
"io/ioutil"
6+
"net/http"
7+
"net/url"
8+
"testing"
9+
10+
"golang.org/x/net/html"
11+
12+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+
restclient "k8s.io/client-go/rest"
14+
15+
userclient "github.com/openshift/origin/pkg/user/generated/internalclientset/typed/user/internalversion"
16+
testutil "github.com/openshift/origin/test/util"
17+
testserver "github.com/openshift/origin/test/util/server"
18+
)
19+
20+
// TestOAuthRequestTokenEndpoint tests obtaining and using a bearer token from the request and display token endpoints.
21+
func TestOAuthRequestTokenEndpoint(t *testing.T) {
22+
// Set up server
23+
masterOptions, err := testserver.DefaultMasterOptions()
24+
if err != nil {
25+
t.Fatalf("unexpected error: %v", err)
26+
}
27+
28+
defer testserver.CleanupMasterEtcd(t, masterOptions)
29+
30+
clusterAdminKubeConfig, err := testserver.StartConfiguredMaster(masterOptions)
31+
if err != nil {
32+
t.Fatalf("unexpected error: %v", err)
33+
}
34+
35+
clientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig)
36+
if err != nil {
37+
t.Fatalf("unexpected error: %v", err)
38+
}
39+
40+
anonConfig := restclient.AnonymousClientConfig(clientConfig)
41+
transport, err := restclient.TransportFor(anonConfig)
42+
if err != nil {
43+
t.Fatalf("unexpected error: %v", err)
44+
}
45+
46+
// Hit the token request endpoint
47+
masterURL, err := url.Parse(clientConfig.Host)
48+
if err != nil {
49+
t.Fatalf("unexpected error: %v", err)
50+
}
51+
masterURL.Path = "/oauth/token/request"
52+
53+
_, tokenHeaderLocation := checkNewReqAndRoundTrip(t, transport, masterURL.String(), false, http.StatusFound)
54+
55+
if len(tokenHeaderLocation) == 0 {
56+
t.Fatalf("no Location header")
57+
}
58+
59+
authRedirect, err := url.Parse(tokenHeaderLocation)
60+
if err != nil {
61+
t.Fatalf("unexpected error %v", err)
62+
}
63+
64+
_, authHeaderLocation := checkNewReqAndRoundTrip(t, transport, authRedirect.String(), true, http.StatusFound)
65+
66+
if len(authHeaderLocation) == 0 {
67+
t.Fatalf("no Location header")
68+
}
69+
70+
displayResp, _ := checkNewReqAndRoundTrip(t, transport, authHeaderLocation, false, http.StatusOK)
71+
apiToken := getTokenFromDisplay(t, displayResp)
72+
73+
// Verify use of the bearer token
74+
userConfig := restclient.AnonymousClientConfig(clientConfig)
75+
userConfig.BearerToken = apiToken
76+
userClient, err := userclient.NewForConfig(userConfig)
77+
if err != nil {
78+
t.Fatalf("Unexpected error: %v", err)
79+
}
80+
81+
user, err := userClient.Users().Get("~", metav1.GetOptions{})
82+
if err != nil {
83+
t.Fatalf("unexpected error: %v", err)
84+
}
85+
if user.Name != "foo" {
86+
t.Fatalf("expected foo as the user, got %v", user.Name)
87+
}
88+
}
89+
90+
// Parse the HTML body for the API token contained in the first <code></code> block
91+
func getTokenFromDisplay(t *testing.T, body []byte) string {
92+
tokenizer := html.NewTokenizer(bytes.NewReader(body))
93+
94+
var seenCode bool
95+
for tokenType := tokenizer.Next(); tokenType != html.ErrorToken; tokenType = tokenizer.Next() {
96+
token := tokenizer.Token()
97+
if tokenType == html.StartTagToken && token.Data == "code" {
98+
seenCode = true
99+
}
100+
if seenCode && tokenType == html.TextToken {
101+
return token.Data
102+
}
103+
}
104+
105+
t.Fatalf("API Token not found in display")
106+
return ""
107+
}
108+
109+
func checkNewReqAndRoundTrip(t *testing.T, rt http.RoundTripper, url string, doBasicAuth bool, expectedCode int) ([]byte, string) {
110+
req, err := http.NewRequest("GET", url, nil)
111+
if err != nil {
112+
t.Fatalf("unexpected error %v", err)
113+
}
114+
115+
req.Header.Set("Accept", "text/html; charset=UTF-8")
116+
117+
if doBasicAuth {
118+
req.SetBasicAuth("foo", "bar")
119+
}
120+
121+
resp, err := rt.RoundTrip(req)
122+
if err != nil {
123+
t.Fatalf("unexpected error %v", err)
124+
}
125+
defer resp.Body.Close()
126+
if resp.StatusCode != expectedCode {
127+
t.Fatalf("unexpected response code %v", resp.StatusCode)
128+
}
129+
130+
body, err := ioutil.ReadAll(resp.Body)
131+
if err != nil {
132+
t.Fatalf("unexpected error %v", err)
133+
}
134+
135+
return body, resp.Header.Get("Location")
136+
}

0 commit comments

Comments
 (0)