MCPcopy Create free account
hub / github.com/TheThingsNetwork/lorawan-stack / SaveAccess

Method SaveAccess

pkg/oauth/storage.go:184–244  ·  view source on GitHub ↗
(data *osin.AccessData)

Source from the content-addressed store, hash-verified

182var errSessionExpired = errors.DefineUnauthenticated("session_expired", "session expired")
183
184func (s *storage) SaveAccess(data *osin.AccessData) error {
185 var accessHash, refreshHash string
186 tokenType, accessID, accessKey, err := auth.SplitToken(data.AccessToken)
187 if err != nil {
188 return err
189 }
190 if tokenType != auth.AccessToken {
191 return errNoAccessToken.New()
192 }
193 accessHash, err = auth.Hash(auth.NewContextWithHashValidator(s.ctx, tokenHashSettings), accessKey)
194 if err != nil {
195 return err
196 }
197 if data.RefreshToken != "" {
198 tokenType, refreshID, refreshKey, err := auth.SplitToken(data.RefreshToken)
199 if err != nil {
200 return err
201 }
202 if tokenType != auth.RefreshToken {
203 return errNoRefreshToken.New()
204 }
205 if refreshID != accessID {
206 return errTokenMismatch.WithAttributes("refresh_token_id", refreshID, "access_token_id", accessID)
207 }
208 refreshHash, err = auth.Hash(auth.NewContextWithHashValidator(s.ctx, tokenHashSettings), refreshKey)
209 if err != nil {
210 return err
211 }
212 }
213 userSessionIDs := data.UserData.(userData).UserSessionIdentifiers
214 client := data.Client.(osinClient).Client
215 rights := rightsFromScope(data.Scope)
216 if data.CreatedAt.IsZero() {
217 data.CreatedAt = time.Now()
218 }
219 var previousID string
220 if data.AccessData != nil {
221 previousID = data.AccessData.UserData.(userData).ID
222 if data.AccessData.AccessToken != "" {
223 data.AccessData.AccessToken = previousID // Used for deleting the old access token
224 }
225 if data.AccessData.RefreshToken != "" {
226 data.AccessData.RefreshToken = previousID // Used for deleting the old access token
227 }
228 }
229 err = s.store.Transact(s.ctx, func(ctx context.Context, st oauth_store.Interface) error {
230 _, err := st.CreateAccessToken(ctx, &ttnpb.OAuthAccessToken{
231 ClientIds: client.GetIds(),
232 UserIds: userSessionIDs.GetUserIds(),
233 UserSessionId: userSessionIDs.SessionId,
234 Rights: rights,
235 Id: accessID,
236 AccessToken: accessHash,
237 RefreshToken: refreshHash,
238 CreatedAt: timestamppb.New(data.CreatedAt),
239 ExpiresAt: timestamppb.New(data.CreatedAt.Add(time.Duration(data.ExpiresIn) * time.Second)),
240 }, previousID)
241 return err

Callers

nothing calls this directly

Calls 14

SplitTokenFunction · 0.92
HashFunction · 0.92
rightsFromScopeFunction · 0.85
NewMethod · 0.65
IsZeroMethod · 0.65
NowMethod · 0.65
TransactMethod · 0.65
CreateAccessTokenMethod · 0.65
AddMethod · 0.65
WithAttributesMethod · 0.45
GetIdsMethod · 0.45

Tested by

no test coverage detected