func (store *MongoStorage) createAccessData(copyFrom *AccessData, osinData *osin.AccessData) *osin.AccessData { if copyFrom.AccessData != nil { osinAccessData := store.createAccessData(copyFrom.AccessData, &osin.AccessData{}) osinData.AccessData = osinAccessData } osinData.AccessToken = copyFrom.AccessToken osinData.RefreshToken = copyFrom.RefreshToken osinData.ExpiresIn = copyFrom.ExpiresIn osinData.Scope = copyFrom.Scope osinData.RedirectUri = copyFrom.RedirectUri osinData.CreatedAt = copyFrom.CreatedAt osinData.UserData = copyFrom.UserData client, err := store.GetClientWithUserData(copyFrom.UserData) if err != nil || client == nil { osinData.Client = &osin.DefaultClient{} } else { osinData.Client = client } authorizeData, err := store.GetAuthorizeDataWithUserData(copyFrom.UserData) if err != nil || client == nil { osinData.AuthorizeData = &osin.AuthorizeData{} } else { osinData.AuthorizeData = authorizeData } return osinData }
// LoadRefresh will load access data from Redis func (r RedisOsinStorageInterface) LoadRefresh(token string) (*osin.AccessData, error) { key := REFRESH_PREFIX + token log.Debug("Loading REFRESH key: ", key) accessJSON, storeErr := r.store.GetKey(key) if storeErr != nil { log.Error("Failure retreiving access token by key") log.Error(storeErr) return nil, storeErr } // new interface means having to make this nested... ick. thisAccessData := osin.AccessData{} thisAccessData.Client = new(osin.DefaultClient) thisAccessData.AuthorizeData = &osin.AuthorizeData{} thisAccessData.AuthorizeData.Client = new(osin.DefaultClient) if marshalErr := json.Unmarshal([]byte(accessJSON), &thisAccessData); marshalErr != nil { log.Error("Couldn't unmarshal OAuth auth data object (LoadRefresh)") log.Error(marshalErr) return nil, marshalErr } return &thisAccessData, nil }
func (s *Storage) LoadAccess(code string) (*osin.AccessData, error) { var userData string var cid, prevAccessToken, authorizeCode string var result osin.AccessData row := s.db.QueryRow("SELECT client, authorize, previous, access_token, refresh_token, expires_in, scope, redirect_uri, created_at, extra FROM access WHERE access_token=$1 LIMIT 1", code) err := row.Scan(&cid, &authorizeCode, &prevAccessToken, &result.AccessToken, &result.RefreshToken, &result.ExpiresIn, &result.Scope, &result.RedirectUri, &result.CreatedAt, &userData) result.UserData = userData client, err := s.GetClient(cid) if err != nil { return nil, err } result.Client = client authorize, err := s.LoadAuthorize(authorizeCode) if err != nil { return nil, err } result.AuthorizeData = authorize if prevAccessToken != "" { prevAccess, err := s.LoadAccess(prevAccessToken) if err != nil { return nil, err } result.AccessData = prevAccess } return &result, err }
// LoadAccess retrieves access data by token. Client information MUST be loaded together. // AuthorizeData and AccessData DON'T NEED to be loaded if not easily available. // Optionally can return error if expired. func (s *Storage) LoadAccess(code string) (*osin.AccessData, error) { var extra, cid, prevAccessToken, authorizeCode string var result osin.AccessData args := map[string]interface{}{ "code": code, } nstmt, err := s.db.PrepareNamed("SELECT client, authorize, previous, access_token, refresh_token, expires_in, scope, redirect_uri, created_at, extra FROM access WHERE access_token=:code LIMIT 1") if err := nstmt.QueryRowx(args).Scan( &cid, &authorizeCode, &prevAccessToken, &result.AccessToken, &result.RefreshToken, &result.ExpiresIn, &result.Scope, &result.RedirectUri, &result.CreatedAt, &extra, ); err == sql.ErrNoRows { return nil, errors.New("not found") } else if err != nil { return nil, errors.New(err) } result.UserData = extra client, err := s.GetClient(cid) if err != nil { return nil, err } result.Client = client authorize, err := s.LoadAuthorize(authorizeCode) if err != nil { return nil, err } result.AuthorizeData = authorize if prevAccessToken != "" { prevAccess, err := s.LoadAccess(prevAccessToken) if err != nil { return nil, err } result.AccessData = prevAccess } return &result, nil }
// LoadAccess retrieves access data by token. Client information MUST be loaded together. // AuthorizeData and AccessData DON'T NEED to be loaded if not easily available. // Optionally can return error if expired. func (s *Storage) LoadAccess(code string) (*osin.AccessData, error) { var extra, cid, prevAccessToken, authorizeCode string var result osin.AccessData if err := s.db.QueryRow( "SELECT client, authorize, previous, access_token, refresh_token, expires_in, scope, redirect_uri, created_at, extra FROM access WHERE access_token=$1 LIMIT 1", code, ).Scan( &cid, &authorizeCode, &prevAccessToken, &result.AccessToken, &result.RefreshToken, &result.ExpiresIn, &result.Scope, &result.RedirectUri, &result.CreatedAt, &extra, ); err == sql.ErrNoRows { return nil, pkg.ErrNotFound } else if err != nil { return nil, errors.New(err) } result.UserData = extra client, err := s.GetClient(cid) if err != nil { return nil, err } result.Client = client authorize, err := s.LoadAuthorize(authorizeCode) if err != nil { return nil, err } result.AuthorizeData = authorize if prevAccessToken != "" { prevAccess, err := s.LoadAccess(prevAccessToken) if err != nil { return nil, err } result.AccessData = prevAccess } return &result, nil }