@@ -60,6 +60,22 @@ var defaultIDToken idTokenClaims = idTokenClaims{
63+var minimalIDToken idTokenClaims = idTokenClaims{
69+ Audience: "https://test.myapp.com",
70+ ExpiresAt: time.Now().Add(time.Duration(5) * time.Minute).Unix(),
72+ IssuedAt: time.Now().Unix(),
73+ Issuer: "https://issuer.example.com",
63type fakeKeySetStub struct{}
79type fakeKeySetStub struct{}
65func (fakeKeySetStub) VerifySignature(_ context.Context, jwt string) (payload []byte, err error) {
81func (fakeKeySetStub) VerifySignature(_ context.Context, jwt string) (payload []byte, err error) {
@@ -253,6 +269,66 @@ func TestOIDCProviderRefreshSessionIfNeededWithIdToken(t *testing.T) {
253 assert.Equal(t, refreshToken, existingSession.RefreshToken)
269 assert.Equal(t, refreshToken, existingSession.RefreshToken)
272+func TestCreateSessionStateFromBearerToken(t *testing.T) {
273+ const profileURLEmail = "janed@me.com"
275+ testCases := map[string]struct {
276+ IDToken idTokenClaims
278+ ExpectedEmail string
280+ "Default IDToken": {
281+ IDToken: defaultIDToken,
283+ ExpectedEmail: profileURLEmail,
285+ "Minimal IDToken with no OIDC Profile URL": {
286+ IDToken: minimalIDToken,
290+ "Minimal IDToken with OIDC Profile URL": {
291+ IDToken: minimalIDToken,
293+ ExpectedEmail: profileURLEmail,
296+ for testName, tc := range testCases {
297+ t.Run(testName, func(t *testing.T) {
298+ jsonResp := []byte(fmt.Sprintf(`{"email":"%s"}`, profileURLEmail))
299+ server, provider := newTestSetup(jsonResp)
300+ defer server.Close()
302+ provider.ProfileURL = &url.URL{}
305+ rawIDToken, err := newSignedTestIDToken(tc.IDToken)
306+ assert.NoError(t, err)
308+ keyset := fakeKeySetStub{}
309+ verifier := oidc.NewVerifier("https://issuer.example.com", keyset,
310+ &oidc.Config{ClientID: "https://test.myapp.com", SkipExpiryCheck: true})
312+ idToken, err := verifier.Verify(context.Background(), rawIDToken)
313+ assert.NoError(t, err)
315+ ss, err := provider.CreateSessionStateFromBearerToken(context.Background(), rawIDToken, idToken)
316+ assert.NoError(t, err)
318+ if tc.ExpectedEmail != "" {
319+ assert.Equal(t, tc.ExpectedEmail, ss.Email)
320+ assert.NotEqual(t, ss.Email, ss.User)
322+ assert.Equal(t, tc.IDToken.Subject, ss.Email)
323+ assert.Equal(t, ss.Email, ss.User)
325+ assert.Equal(t, rawIDToken, ss.IDToken)
326+ assert.Equal(t, rawIDToken, ss.AccessToken)
327+ assert.Equal(t, "", ss.RefreshToken)
256func TestOIDCProvider_findVerifiedIdToken(t *testing.T) {
332func TestOIDCProvider_findVerifiedIdToken(t *testing.T) {
258 server, provider := newTestSetup([]byte(""))
334 server, provider := newTestSetup([]byte(""))