MCPcopy Create free account
hub / github.com/PatchMon/PatchMon / Exchange

Method Exchange

server-source-code/internal/auth/oidc/client.go:156–263  ·  view source on GitHub ↗

Exchange exchanges the authorization code for tokens and fetches UserInfo.

(ctx context.Context, code, codeVerifier, expectedState, expectedNonce string, callbackParams url.Values)

Source from the content-addressed store, hash-verified

154
155// Exchange exchanges the authorization code for tokens and fetches UserInfo.
156func (c *Client) Exchange(ctx context.Context, code, codeVerifier, expectedState, expectedNonce string, callbackParams url.Values) (*UserInfo, error) {
157 if err := c.connect(ctx); err != nil {
158 return nil, err
159 }
160 if code == "" {
161 return nil, errors.New("oidc: missing code parameter")
162 }
163 if expectedState == "" {
164 return nil, errors.New("oidc: missing state parameter")
165 }
166
167 state := callbackParams.Get("state")
168 if state != expectedState {
169 return nil, errors.New("oidc: state mismatch")
170 }
171
172 opts := []oauth2.AuthCodeOption{
173 oauth2.VerifierOption(codeVerifier),
174 }
175
176 token, err := c.oauth2.Exchange(ctx, code, opts...)
177 if err != nil {
178 return nil, fmt.Errorf("oidc: token exchange: %w", err)
179 }
180
181 rawIDToken, ok := token.Extra("id_token").(string)
182 if !ok || rawIDToken == "" {
183 return nil, errors.New("oidc: no id_token in response")
184 }
185
186 idToken, err := c.verifier.Verify(ctx, rawIDToken)
187 if err != nil {
188 return nil, fmt.Errorf("oidc: verify id_token: %w", err)
189 }
190
191 if idToken.Subject == "" {
192 return nil, errors.New("oidc: id_token missing sub claim")
193 }
194
195 if expectedNonce != "" {
196 if idToken.Nonce != expectedNonce {
197 return nil, errors.New("oidc: nonce mismatch")
198 }
199 }
200
201 userInfo := &UserInfo{
202 Sub: idToken.Subject,
203 IDToken: rawIDToken,
204 }
205
206 userInfoClaims := make(map[string]interface{})
207 if token.AccessToken != "" {
208 oidcUserInfo, err := c.provider.UserInfo(ctx, oauth2.StaticTokenSource(token))
209 if err != nil {
210 if !isMicrosoftIdentityIssuer(c.cfg.IssuerURL) {
211 return nil, fmt.Errorf("oidc: fetch userinfo: %w", err)
212 }
213 } else {

Callers 1

CallbackMethod · 0.80

Calls 7

connectMethod · 0.95
getStringClaimFunction · 0.85
getBoolClaimFunction · 0.85
resolveProviderPictureFunction · 0.85
extractGroupsFunction · 0.85
GetMethod · 0.45

Tested by

no test coverage detected