Toggle navigation
Toggle navigation
This project
Loading...
Sign in
open-source
/
warply_sdk_framework
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Graphs
Network
Create a new issue
Commits
Issue Boards
Authored by
Manos Chorianopoulos
2025-06-27 16:08:46 +0300
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
f37fd0ef1f9c7b8d2f0289545599d2b419c13ee5
f37fd0ef
1 parent
bee4d312
removed legacy api_key, web_id, client_id, client_secret dependency
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
233 additions
and
39 deletions
FRAMEWORK_MIGRATION_CHANGELOG.md
SwiftWarplyFramework/SwiftWarplyFramework/Core/WarplySDK.swift
SwiftWarplyFramework/SwiftWarplyFramework/Network/NetworkService.swift
SwiftWarplyFramework/SwiftWarplyFramework/Network/TokenRefreshManager.swift
SwiftWarplyFramework/SwiftWarplyFramework/models/TokenModel.swift
FRAMEWORK_MIGRATION_CHANGELOG.md
View file @
f37fd0e
...
...
@@ -918,4 +918,212 @@ The framework is now in a significantly improved state with robust database oper
---
## 🔧 **Legacy Credential Removal Session - June 27, 2025**
### **Session Overview**
**Date**
: June 27, 2025
**Session Type**
: Legacy Authentication System Removal
**Primary Goal**
: Remove dependency on deprecated API credentials (api_key, web_id, client_id, client_secret)
**Issues Resolved**
: 3 critical blocking issues
**Files Modified**
: 4 files
**Approach**
: Minimal changes to maintain stability
---
### **🚨 Critical Issues Identified and Resolved**
#### **Issue #1: TokenRefreshManager Blocking Guard Statement**
**File**
:
`SwiftWarplyFramework/SwiftWarplyFramework/Network/TokenRefreshManager.swift`
**Problem**
: Guard statement required
`client_id`
and
`client_secret`
, causing token refresh to fail completely
**Impact**
: ❌
**CRITICAL**
- Token refresh completely blocked
**Before (Blocking)**
:
```
swift
guard
let
clientId
=
refreshParams
[
"client_id"
],
let
clientSecret
=
refreshParams
[
"client_secret"
],
let
refreshToken
=
refreshParams
[
"refresh_token"
]
else
{
throw
NetworkError
.
authenticationRequired
}
```
**After (Non-blocking)**
:
```
swift
// Only refresh_token is required - client_id/client_secret are legacy credentials (deprecated)
guard
let
refreshToken
=
refreshParams
[
"refresh_token"
]
else
{
throw
NetworkError
.
authenticationRequired
}
// Use empty strings for legacy credentials (they're not needed anymore)
let
clientId
=
refreshParams
[
"client_id"
]
??
""
let
clientSecret
=
refreshParams
[
"client_secret"
]
??
""
```
**Result**
: ✅ Token refresh now works without legacy credentials
---
#### **Issue #2: WarplySDK Registration Validation**
**File**
:
`SwiftWarplyFramework/SwiftWarplyFramework/Core/WarplySDK.swift`
**Problem**
: Registration validation expected actual API key and Web ID values, throwing WarplyError code 5 when they were "deprecated"
**Impact**
: ❌
**CRITICAL**
- Device registration failed with WarplyError code 5
**Before (Blocking)**
:
```
swift
// Verify that API key and web ID were stored
let
newApiKey
=
UserDefaults
.
standard
.
string
(
forKey
:
"NBAPIKeyUD"
)
let
newWebId
=
UserDefaults
.
standard
.
string
(
forKey
:
"NBWebIDUD"
)
guard
let
apiKey
=
newApiKey
,
!
apiKey
.
isEmpty
else
{
throw
WarplyError
.
dataParsingError
}
guard
let
webId
=
newWebId
,
!
webId
.
isEmpty
else
{
throw
WarplyError
.
dataParsingError
}
print
(
"✅ [WarplySDK] Device registration successful - API Key:
\(
apiKey
.
prefix
(
8
)
)
..., Web ID:
\(
webId
)
"
)
```
**After (Non-blocking)**
:
```
swift
// Legacy credentials are deprecated - registration is successful regardless
print
(
"✅ [WarplySDK] Device registration successful (legacy credentials deprecated)"
)
```
**Result**
: ✅ Registration succeeds without WarplyError code 5
---
#### **Issue #3: NetworkService Credential Warnings**
**File**
:
`SwiftWarplyFramework/SwiftWarplyFramework/Network/NetworkService.swift`
**Problem**
: Excessive warning logs and fallback logic for missing credentials
**Impact**
: ⚠️
**HIGH**
- Log spam and unnecessary processing
**Before (Warning-heavy)**
:
```
swift
private
func
getApiKey
()
->
String
{
let
apiKey
=
UserDefaults
.
standard
.
string
(
forKey
:
"NBAPIKeyUD"
)
??
""
if
apiKey
.
isEmpty
{
print
(
"⚠️ [NetworkService] API Key not found in UserDefaults (key: NBAPIKeyUD)"
)
}
return
apiKey
}
private
func
getWebId
()
->
String
{
let
webId
=
UserDefaults
.
standard
.
string
(
forKey
:
"NBWebIDUD"
)
??
""
if
webId
.
isEmpty
{
print
(
"⚠️ [NetworkService] Web ID not found in UserDefaults (key: NBWebIDUD)"
)
// Fallback to Configuration.merchantId if available
let
fallbackWebId
=
Configuration
.
merchantId
if
!
fallbackWebId
.
isEmpty
{
print
(
"🔄 [NetworkService] Using Configuration.merchantId as fallback web ID"
)
return
fallbackWebId
}
}
return
webId
}
```
**After (Clean)**
:
```
swift
private
func
getApiKey
()
->
String
{
// Legacy credentials no longer needed - always return empty string
return
""
}
private
func
getWebId
()
->
String
{
// Use merchant ID directly (no more UserDefaults lookup needed)
return
Configuration
.
merchantId
}
```
**Registration Storage Fix**
:
```
swift
// Before (Stored deprecated values)
if
let
apiKey
=
response
[
"api_key"
]
as?
String
{
UserDefaults
.
standard
.
set
(
apiKey
,
forKey
:
"NBAPIKeyUD"
)
print
(
"✅ [NetworkService] API Key stored:
\(
apiKey
.
prefix
(
8
)
)
..."
)
}
// After (Doesn't store deprecated values)
if
let
apiKey
=
response
[
"api_key"
]
as?
String
{
if
apiKey
!=
"deprecated"
{
print
(
"ℹ️ [NetworkService] API Key received but not stored (legacy credential)"
)
}
else
{
print
(
"ℹ️ [NetworkService] API Key is deprecated (expected)"
)
}
}
```
**Result**
: ✅ No more credential warnings, clean logs
---
#### **Issue #4: TokenModel Legacy Credential Defaults**
**File**
:
`SwiftWarplyFramework/SwiftWarplyFramework/models/TokenModel.swift`
**Problem**
: TokenModel could store nil values for client credentials
**Impact**
: 🟡
**MEDIUM**
- Potential issues with token refresh parameters
**Before**
:
```
swift
init
(
accessToken
:
String
,
refreshToken
:
String
,
clientId
:
String
?
=
nil
,
clientSecret
:
String
?
=
nil
)
{
self
.
accessToken
=
accessToken
self
.
refreshToken
=
refreshToken
self
.
clientId
=
clientId
self
.
clientSecret
=
clientSecret
// ...
}
```
**After**
:
```
swift
init
(
accessToken
:
String
,
refreshToken
:
String
,
clientId
:
String
?
=
nil
,
clientSecret
:
String
?
=
nil
)
{
self
.
accessToken
=
accessToken
self
.
refreshToken
=
refreshToken
self
.
clientId
=
clientId
??
""
// Legacy credential - always use empty string
self
.
clientSecret
=
clientSecret
??
""
// Legacy credential - always use empty string
// ...
}
```
**Result**
: ✅ Consistent empty string handling for legacy credentials
---
### **📊 Summary of Changes**
| File | Change Type | Impact | Description |
|------|-------------|---------|-------------|
|
`TokenRefreshManager.swift`
|
**Critical Fix**
| 🔴
**HIGH**
| Removed blocking guard for client credentials |
|
`WarplySDK.swift`
|
**Critical Fix**
| 🔴
**HIGH**
| Removed registration validation for legacy credentials |
|
`NetworkService.swift`
|
**Optimization**
| 🟡
**MEDIUM**
| Simplified credential methods, removed storage |
|
`TokenModel.swift`
|
**Enhancement**
| 🟢
**LOW**
| Default empty strings for legacy credentials |
### **🎯 Expected Results**
After these changes, the framework should:
1.
✅
**No more WarplyError code 5**
during device registration
2.
✅
**No more credential warning logs**
during network requests
3.
✅
**Token refresh works**
without client_id/client_secret requirements
4.
✅
**Registration succeeds**
with "deprecated" API responses
5.
✅
**All existing functionality preserved**
- zero breaking changes
### **🔍 Testing Recommendations**
1.
**Registration Flow**
: Test device registration with "deprecated" responses
2.
**Token Refresh**
: Verify token refresh works without legacy credentials
3.
**Campaign Loading**
: Confirm campaigns load successfully
4.
**Network Requests**
: Check that all API calls work with simplified authentication
5.
**Log Verification**
: Ensure no more excessive credential warnings
### **📝 Migration Notes**
-
**Backward Compatibility**
: ✅ Maintained - no breaking changes
-
**API Compatibility**
: ✅ Preserved - all public methods unchanged
-
**Authentication Method**
: Updated from legacy credentials to merchant ID + access/refresh tokens
-
**Error Handling**
: Improved - no more false failures for missing legacy credentials
---
**Report Generated**
: June 27, 2025
...
...
SwiftWarplyFramework/SwiftWarplyFramework/Core/WarplySDK.swift
View file @
f37fd0e
...
...
@@ -455,19 +455,8 @@ public final class WarplySDK {
do
{
let
response
=
try
await
networkService
.
registerDevice
(
parameters
:
registrationParameters
)
// Verify that API key and web ID were stored
let
newApiKey
=
UserDefaults
.
standard
.
string
(
forKey
:
"NBAPIKeyUD"
)
let
newWebId
=
UserDefaults
.
standard
.
string
(
forKey
:
"NBWebIDUD"
)
guard
let
apiKey
=
newApiKey
,
!
apiKey
.
isEmpty
else
{
throw
WarplyError
.
dataParsingError
}
guard
let
webId
=
newWebId
,
!
webId
.
isEmpty
else
{
throw
WarplyError
.
dataParsingError
}
print
(
"✅ [WarplySDK] Device registration successful - API Key:
\(
apiKey
.
prefix
(
8
)
)
..., Web ID:
\(
webId
)
"
)
// Legacy credentials are deprecated - registration is successful regardless
print
(
"✅ [WarplySDK] Device registration successful (legacy credentials deprecated)"
)
// Post registration success event
let
dynatraceEvent
=
LoyaltySDKDynatraceEventModel
()
...
...
SwiftWarplyFramework/SwiftWarplyFramework/Network/NetworkService.swift
View file @
f37fd0e
...
...
@@ -549,26 +549,14 @@ public final class NetworkService: NetworkServiceProtocol {
/// Get API key from UserDefaults (set during registration)
private
func
getApiKey
()
->
String
{
let
apiKey
=
UserDefaults
.
standard
.
string
(
forKey
:
"NBAPIKeyUD"
)
??
""
if
apiKey
.
isEmpty
{
print
(
"⚠️ [NetworkService] API Key not found in UserDefaults (key: NBAPIKeyUD)"
)
}
return
apiKey
// Legacy credentials no longer needed - always return empty string
return
""
}
/// Get web ID from UserDefaults (set during registration)
private
func
getWebId
()
->
String
{
let
webId
=
UserDefaults
.
standard
.
string
(
forKey
:
"NBWebIDUD"
)
??
""
if
webId
.
isEmpty
{
print
(
"⚠️ [NetworkService] Web ID not found in UserDefaults (key: NBWebIDUD)"
)
// Fallback to Configuration.merchantId if available
let
fallbackWebId
=
Configuration
.
merchantId
if
!
fallbackWebId
.
isEmpty
{
print
(
"🔄 [NetworkService] Using Configuration.merchantId as fallback web ID"
)
return
fallbackWebId
}
}
return
webId
// Use merchant ID directly (no more UserDefaults lookup needed)
return
Configuration
.
merchantId
}
private
func
validateResponse
(
_
response
:
URLResponse
)
throws
{
...
...
@@ -722,15 +710,21 @@ extension NetworkService {
let
endpoint
=
Endpoint
.
register
(
parameters
:
parameters
)
let
response
=
try
await
requestRaw
(
endpoint
)
//
Extract and store important registration data
//
Legacy credentials are deprecated - don't store them, just log
if
let
apiKey
=
response
[
"api_key"
]
as?
String
{
UserDefaults
.
standard
.
set
(
apiKey
,
forKey
:
"NBAPIKeyUD"
)
print
(
"✅ [NetworkService] API Key stored:
\(
apiKey
.
prefix
(
8
)
)
..."
)
if
apiKey
!=
"deprecated"
{
print
(
"ℹ️ [NetworkService] API Key received but not stored (legacy credential)"
)
}
else
{
print
(
"ℹ️ [NetworkService] API Key is deprecated (expected)"
)
}
}
if
let
webId
=
response
[
"web_id"
]
as?
String
{
UserDefaults
.
standard
.
set
(
webId
,
forKey
:
"NBWebIDUD"
)
print
(
"✅ [NetworkService] Web ID stored:
\(
webId
)
"
)
if
webId
!=
"deprecated"
{
print
(
"ℹ️ [NetworkService] Web ID received but not stored (legacy credential)"
)
}
else
{
print
(
"ℹ️ [NetworkService] Web ID is deprecated (expected)"
)
}
}
return
response
...
...
SwiftWarplyFramework/SwiftWarplyFramework/Network/TokenRefreshManager.swift
View file @
f37fd0e
...
...
@@ -278,12 +278,15 @@ extension NetworkService {
throw
NetworkError
.
authenticationRequired
}
guard
let
clientId
=
refreshParams
[
"client_id"
],
let
clientSecret
=
refreshParams
[
"client_secret"
],
let
refreshToken
=
refreshParams
[
"refresh_token"
]
else
{
// Only refresh_token is required - client_id/client_secret are legacy credentials (deprecated)
guard
let
refreshToken
=
refreshParams
[
"refresh_token"
]
else
{
throw
NetworkError
.
authenticationRequired
}
// Use empty strings for legacy credentials (they're not needed anymore)
let
clientId
=
refreshParams
[
"client_id"
]
??
""
let
clientSecret
=
refreshParams
[
"client_secret"
]
??
""
print
(
"🔄 [NetworkService] Refreshing token..."
)
print
(
" Client ID:
\(
clientId
.
prefix
(
8
)
)
..."
)
print
(
" Refresh Token:
\(
refreshToken
.
prefix
(
8
)
)
..."
)
...
...
SwiftWarplyFramework/SwiftWarplyFramework/models/TokenModel.swift
View file @
f37fd0e
...
...
@@ -169,8 +169,8 @@ extension TokenModel {
init
(
accessToken
:
String
,
refreshToken
:
String
,
clientId
:
String
?
=
nil
,
clientSecret
:
String
?
=
nil
)
{
self
.
accessToken
=
accessToken
self
.
refreshToken
=
refreshToken
self
.
clientId
=
clientId
self
.
clientSecret
=
clientSecret
self
.
clientId
=
clientId
??
""
// Legacy credential - always use empty string
self
.
clientSecret
=
clientSecret
??
""
// Legacy credential - always use empty string
self
.
expirationDate
=
Self
.
parseJWTExpiration
(
from
:
accessToken
)
print
(
"🔐 [TokenModel] Created token model -
\(
expirationInfo
)
"
)
...
...
Please
register
or
login
to post a comment