From 63d5e6d94c0ef5343271dc96d480618e68ddcdc4 Mon Sep 17 00:00:00 2001 From: Harendra Chhekur <820121223505e@gmail.com> Date: Fri, 18 Feb 2022 22:20:18 +0530 Subject: [PATCH] feat(auth): Bearer Auth Support (oauth 2.0) --- jira.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/jira.go b/jira.go index a6e6b2e6..d7df3114 100644 --- a/jira.go +++ b/jira.go @@ -382,6 +382,41 @@ func (t *BasicAuthTransport) transport() http.RoundTripper { return http.DefaultTransport } +// BearerAuthTransport is a http.RoundTripper that authenticates all requests +// using Jira's bearer (oauth 2.0 (3lo)) based authentication. +type BearerAuthTransport struct { + Token string + + // Transport is the underlying HTTP transport to use when making requests. + // It will default to http.DefaultTransport if nil. + Transport http.RoundTripper +} + +// RoundTrip implements the RoundTripper interface. We just add the +// bearer token and return the RoundTripper for this transport type. +func (t *BearerAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) { + req2 := cloneRequest(req) // per RoundTripper contract + + req2.Header.Set("Authorization", fmt.Sprintf("Bearer %s", t.Token)) + return t.transport().RoundTrip(req2) +} + +// Client returns an *http.Client that makes requests that are authenticated +// using HTTP Basic Authentication. This is a nice little bit of sugar +// so we can just get the client instead of creating the client in the calling code. +// If it's necessary to send more information on client init, the calling code can +// always skip this and set the transport itself. +func (t *BearerAuthTransport) Client() *http.Client { + return &http.Client{Transport: t} +} + +func (t *BearerAuthTransport) transport() http.RoundTripper { + if t.Transport != nil { + return t.Transport + } + return http.DefaultTransport +} + // PATAuthTransport is an http.RoundTripper that authenticates all requests // using the Personal Access Token specified. // See here for more info: https://confluence.atlassian.com/enterprise/using-personal-access-tokens-1026032365.html