// CallbackHandler handles OAuth1 callback requests by parsing the oauth token // and verifier, reading the request token secret from the ctx, then obtaining // an access token and adding it to the ctx. func CallbackHandler(config *oauth1.Config, success, failure ctxh.ContextHandler) ctxh.ContextHandler { if failure == nil { failure = gologin.DefaultFailureHandler } fn := func(ctx context.Context, w http.ResponseWriter, req *http.Request) { requestToken, verifier, err := oauth1.ParseAuthorizationCallback(req) if err != nil { ctx = gologin.WithError(ctx, err) failure.ServeHTTP(ctx, w, req) return } // upstream handler should add the request token secret from the login step _, requestSecret, err := RequestTokenFromContext(ctx) if err != nil { ctx = gologin.WithError(ctx, err) failure.ServeHTTP(ctx, w, req) return } accessToken, accessSecret, err := config.AccessToken(requestToken, requestSecret, verifier) if err != nil { ctx = gologin.WithError(ctx, err) failure.ServeHTTP(ctx, w, req) return } ctx = WithAccessToken(ctx, accessToken, accessSecret) success.ServeHTTP(ctx, w, req) } return ctxh.ContextHandlerFunc(fn) }