Skip to content

Commit bfb6527

Browse files
jinliu9508jkasten2
authored andcommitted
Add JWT to HttpClient, backend services, and operations
fixup # Conflicts: # OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt
1 parent faf5ee4 commit bfb6527

File tree

15 files changed

+158
-35
lines changed

15 files changed

+158
-35
lines changed

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/HttpClient.kt

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,29 +46,39 @@ internal class HttpClient(
4646
url: String,
4747
body: JSONObject,
4848
headers: OptionalHeaders?,
49-
): HttpResponse = makeRequest(url, "POST", body, _configModelStore.model.httpTimeout, headers)
49+
): HttpResponse {
50+
return makeRequest(url, "POST", body, _configModelStore.model.httpTimeout, headers)
51+
}
5052

5153
override suspend fun get(
5254
url: String,
5355
headers: OptionalHeaders?,
54-
): HttpResponse = makeRequest(url, null, null, _configModelStore.model.httpGetTimeout, headers)
56+
): HttpResponse {
57+
return makeRequest(url, null, null, _configModelStore.model.httpGetTimeout, headers)
58+
}
5559

5660
override suspend fun put(
5761
url: String,
5862
body: JSONObject,
5963
headers: OptionalHeaders?,
60-
): HttpResponse = makeRequest(url, "PUT", body, _configModelStore.model.httpTimeout, headers)
64+
): HttpResponse {
65+
return makeRequest(url, "PUT", body, _configModelStore.model.httpTimeout, headers)
66+
}
6167

6268
override suspend fun patch(
6369
url: String,
6470
body: JSONObject,
6571
headers: OptionalHeaders?,
66-
): HttpResponse = makeRequest(url, "PATCH", body, _configModelStore.model.httpTimeout, headers)
72+
): HttpResponse {
73+
return makeRequest(url, "PATCH", body, _configModelStore.model.httpTimeout, headers)
74+
}
6775

6876
override suspend fun delete(
6977
url: String,
7078
headers: OptionalHeaders?,
71-
): HttpResponse = makeRequest(url, "DELETE", null, _configModelStore.model.httpTimeout, headers)
79+
): HttpResponse {
80+
return makeRequest(url, "DELETE", null, _configModelStore.model.httpTimeout, headers)
81+
}
7282

7383
private suspend fun makeRequest(
7484
url: String,
@@ -137,6 +147,10 @@ internal class HttpClient(
137147
con.readTimeout = timeout
138148
con.setRequestProperty("SDK-Version", "onesignal/android/" + OneSignalUtils.SDK_VERSION)
139149

150+
if (headers != null && !headers.jwt.isNullOrEmpty()) {
151+
con.setRequestProperty("Authorization", "Bearer ${headers.jwt}")
152+
}
153+
140154
if (OneSignalWrapper.sdkType != null && OneSignalWrapper.sdkVersion != null) {
141155
con.setRequestProperty("SDK-Wrapper", "onesignal/${OneSignalWrapper.sdkType}/${OneSignalWrapper.sdkVersion}")
142156
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/http/impl/OptionalHeaders.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ data class OptionalHeaders(
1717
* Used to track delay between session start and request
1818
*/
1919
val sessionDuration: Long? = null,
20+
val jwt: String? = null,
21+
val deviceAuthPushToken: String? = null,
2022
)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/IIdentityBackendService.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ interface IIdentityBackendService {
1818
aliasLabel: String,
1919
aliasValue: String,
2020
identities: Map<String, String>,
21+
jwt: String? = null,
2122
): Map<String, String>
2223

2324
/**
@@ -35,6 +36,7 @@ interface IIdentityBackendService {
3536
aliasLabel: String,
3637
aliasValue: String,
3738
aliasLabelToDelete: String,
39+
jwt: String? = null,
3840
)
3941
}
4042

@@ -48,4 +50,9 @@ object IdentityConstants {
4850
* The alias label for the internal onesignal ID alias.
4951
*/
5052
const val ONESIGNAL_ID = "onesignal_id"
53+
54+
/**
55+
* The alias label for the jwt token.
56+
*/
57+
const val JWT_TOKEN = "jwt_token"
5158
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/ISubscriptionBackendService.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ interface ISubscriptionBackendService {
2222
aliasLabel: String,
2323
aliasValue: String,
2424
subscription: SubscriptionObject,
25+
jwt: String? = null,
2526
): Pair<String, RywData?>?
2627

2728
/**
@@ -46,6 +47,7 @@ interface ISubscriptionBackendService {
4647
suspend fun deleteSubscription(
4748
appId: String,
4849
subscriptionId: String,
50+
jwt: String? = null,
4951
)
5052

5153
/**
@@ -61,6 +63,7 @@ interface ISubscriptionBackendService {
6163
subscriptionId: String,
6264
aliasLabel: String,
6365
aliasValue: String,
66+
jwt: String? = null,
6467
)
6568

6669
/**
@@ -74,5 +77,6 @@ interface ISubscriptionBackendService {
7477
suspend fun getIdentityFromSubscription(
7578
appId: String,
7679
subscriptionId: String,
80+
jwt: String? = null,
7781
): Map<String, String>
7882
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/IUserBackendService.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ interface IUserBackendService {
2424
identities: Map<String, String>,
2525
subscriptions: List<SubscriptionObject>,
2626
properties: Map<String, String>,
27+
jwt: String? = null,
2728
): CreateUserResponse
2829
// TODO: Change to send only the push subscription, optimally
2930

@@ -48,6 +49,7 @@ interface IUserBackendService {
4849
properties: PropertiesObject,
4950
refreshDeviceMetadata: Boolean,
5051
propertyiesDelta: PropertiesDeltasObject,
52+
jwt: String? = null,
5153
): RywData?
5254

5355
/**
@@ -65,6 +67,7 @@ interface IUserBackendService {
6567
appId: String,
6668
aliasLabel: String,
6769
aliasValue: String,
70+
jwt: String? = null,
6871
): CreateUserResponse
6972
}
7073

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/impl/IdentityBackendService.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ internal class IdentityBackendService(
1515
aliasLabel: String,
1616
aliasValue: String,
1717
identities: Map<String, String>,
18+
jwt: String?,
1819
): Map<String, String> {
1920
val requestJSONObject =
2021
JSONObject()
2122
.put("identity", JSONObject().putMap(identities))
2223

23-
val response = _httpClient.patch("apps/$appId/users/by/$aliasLabel/$aliasValue/identity", requestJSONObject)
24+
val response = _httpClient.patch("apps/$appId/users/by/$aliasLabel/$aliasValue/identity", requestJSONObject, jwt)
2425

2526
if (!response.isSuccess) {
2627
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)
@@ -36,8 +37,9 @@ internal class IdentityBackendService(
3637
aliasLabel: String,
3738
aliasValue: String,
3839
aliasLabelToDelete: String,
40+
jwt: String?,
3941
) {
40-
val response = _httpClient.delete("apps/$appId/users/by/$aliasLabel/$aliasValue/identity/$aliasLabelToDelete")
42+
val response = _httpClient.delete("apps/$appId/users/by/$aliasLabel/$aliasValue/identity/$aliasLabelToDelete", jwt)
4143

4244
if (!response.isSuccess) {
4345
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/impl/SubscriptionBackendService.kt

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.onesignal.user.internal.backend.impl
22

3+
import android.util.Base64
34
import com.onesignal.common.consistency.RywData
45
import com.onesignal.common.exceptions.BackendException
56
import com.onesignal.common.safeJSONObject
67
import com.onesignal.common.safeLong
78
import com.onesignal.common.safeString
89
import com.onesignal.common.toMap
910
import com.onesignal.core.internal.http.IHttpClient
11+
import com.onesignal.core.internal.http.impl.OptionalHeaders
1012
import com.onesignal.user.internal.backend.ISubscriptionBackendService
1113
import com.onesignal.user.internal.backend.SubscriptionObject
1214
import org.json.JSONObject
@@ -19,12 +21,23 @@ internal class SubscriptionBackendService(
1921
aliasLabel: String,
2022
aliasValue: String,
2123
subscription: SubscriptionObject,
24+
jwt: String?,
2225
): Pair<String, RywData?>? {
2326
val jsonSubscription = JSONConverter.convertToJSON(subscription)
2427
jsonSubscription.remove("id")
2528
val requestJSON = JSONObject().put("subscription", jsonSubscription)
2629

27-
val response = _httpClient.post("apps/$appId/users/by/$aliasLabel/$aliasValue/subscriptions", requestJSON)
30+
val base64Token =
31+
Base64.encodeToString(
32+
subscription.token?.toByteArray(charset("UTF-8")),
33+
Base64.NO_WRAP,
34+
)
35+
val response =
36+
_httpClient.post(
37+
"apps/$appId/users/by/$aliasLabel/$aliasValue/subscriptions",
38+
requestJSON,
39+
OptionalHeaders(jwt = jwt, deviceAuthPushToken = base64Token),
40+
)
2841

2942
if (!response.isSuccess) {
3043
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)
@@ -56,7 +69,17 @@ internal class SubscriptionBackendService(
5669
JSONObject()
5770
.put("subscription", JSONConverter.convertToJSON(subscription))
5871

59-
val response = _httpClient.patch("apps/$appId/subscriptions/$subscriptionId", requestJSON)
72+
val base64Token =
73+
Base64.encodeToString(
74+
subscription.token?.toByteArray(charset("UTF-8")),
75+
Base64.NO_WRAP,
76+
)
77+
val response =
78+
_httpClient.patch(
79+
"apps/$appId/subscriptions/$subscriptionId",
80+
requestJSON,
81+
OptionalHeaders(deviceAuthPushToken = base64Token),
82+
)
6083

6184
if (!response.isSuccess) {
6285
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)
@@ -77,8 +100,9 @@ internal class SubscriptionBackendService(
77100
override suspend fun deleteSubscription(
78101
appId: String,
79102
subscriptionId: String,
103+
jwt: String?,
80104
) {
81-
val response = _httpClient.delete("apps/$appId/subscriptions/$subscriptionId")
105+
val response = _httpClient.delete("apps/$appId/subscriptions/$subscriptionId", OptionalHeaders(jwt = jwt))
82106

83107
if (!response.isSuccess) {
84108
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)
@@ -90,12 +114,13 @@ internal class SubscriptionBackendService(
90114
subscriptionId: String,
91115
aliasLabel: String,
92116
aliasValue: String,
117+
jwt: String?,
93118
) {
94119
val requestJSON =
95120
JSONObject()
96121
.put("identity", JSONObject().put(aliasLabel, aliasValue))
97122

98-
val response = _httpClient.patch("apps/$appId/subscriptions/$subscriptionId/owner", requestJSON)
123+
val response = _httpClient.patch("apps/$appId/subscriptions/$subscriptionId/owner", requestJSON, OptionalHeaders(jwt = jwt))
99124

100125
if (!response.isSuccess) {
101126
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)
@@ -105,8 +130,9 @@ internal class SubscriptionBackendService(
105130
override suspend fun getIdentityFromSubscription(
106131
appId: String,
107132
subscriptionId: String,
133+
jwt: String?,
108134
): Map<String, String> {
109-
val response = _httpClient.get("apps/$appId/subscriptions/$subscriptionId/user/identity")
135+
val response = _httpClient.get("apps/$appId/subscriptions/$subscriptionId/user/identity", OptionalHeaders(jwt = jwt))
110136

111137
if (!response.isSuccess) {
112138
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/impl/UserBackendService.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.onesignal.common.putMap
66
import com.onesignal.common.safeLong
77
import com.onesignal.common.safeString
88
import com.onesignal.core.internal.http.IHttpClient
9+
import com.onesignal.core.internal.http.impl.OptionalHeaders
910
import com.onesignal.user.internal.backend.CreateUserResponse
1011
import com.onesignal.user.internal.backend.IUserBackendService
1112
import com.onesignal.user.internal.backend.PropertiesDeltasObject
@@ -21,6 +22,7 @@ internal class UserBackendService(
2122
identities: Map<String, String>,
2223
subscriptions: List<SubscriptionObject>,
2324
properties: Map<String, String>,
25+
jwt: String?,
2426
): CreateUserResponse {
2527
val requestJSON = JSONObject()
2628

@@ -39,7 +41,7 @@ internal class UserBackendService(
3941

4042
requestJSON.put("refresh_device_metadata", true)
4143

42-
val response = _httpClient.post("apps/$appId/users", requestJSON)
44+
val response = _httpClient.post("apps/$appId/users", requestJSON, OptionalHeaders(jwt = jwt))
4345

4446
if (!response.isSuccess) {
4547
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)
@@ -55,6 +57,7 @@ internal class UserBackendService(
5557
properties: PropertiesObject,
5658
refreshDeviceMetadata: Boolean,
5759
propertyiesDelta: PropertiesDeltasObject,
60+
jwt: String?,
5861
): RywData? {
5962
val jsonObject =
6063
JSONObject()
@@ -68,7 +71,7 @@ internal class UserBackendService(
6871
jsonObject.put("deltas", JSONConverter.convertToJSON(propertyiesDelta))
6972
}
7073

71-
val response = _httpClient.patch("apps/$appId/users/by/$aliasLabel/$aliasValue", jsonObject)
74+
val response = _httpClient.patch("apps/$appId/users/by/$aliasLabel/$aliasValue", jsonObject, jwt)
7275

7376
if (!response.isSuccess) {
7477
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)
@@ -90,8 +93,9 @@ internal class UserBackendService(
9093
appId: String,
9194
aliasLabel: String,
9295
aliasValue: String,
96+
jwt: String?,
9397
): CreateUserResponse {
94-
val response = _httpClient.get("apps/$appId/users/by/$aliasLabel/$aliasValue")
98+
val response = _httpClient.get("apps/$appId/users/by/$aliasLabel/$aliasValue", jwt)
9599

96100
if (!response.isSuccess) {
97101
throw BackendException(response.statusCode, response.payload, response.retryAfterSeconds)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/identity/IdentityModelStore.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,21 @@ package com.onesignal.user.internal.identity
33
import com.onesignal.common.modeling.SimpleModelStore
44
import com.onesignal.common.modeling.SingletonModelStore
55
import com.onesignal.core.internal.preferences.IPreferencesService
6+
import com.onesignal.user.internal.backend.IdentityConstants
67

78
open class IdentityModelStore(prefs: IPreferencesService) : SingletonModelStore<IdentityModel>(
89
SimpleModelStore({ IdentityModel() }, "identity", prefs),
910
) {
1011
fun invalidateJwt() {
1112
model.jwtToken = ""
1213
}
14+
15+
// Use externalId instead of onesignalId when a jwt is present
16+
fun getIdentityAlias(): Pair<String, String> {
17+
if (model.jwtToken.isNullOrEmpty()) {
18+
return Pair(IdentityConstants.ONESIGNAL_ID, model.onesignalId)
19+
}
20+
21+
return Pair(IdentityConstants.EXTERNAL_ID, model.externalId!!)
22+
}
1323
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/UpdateSubscriptionOperation.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,20 +81,32 @@ class UpdateSubscriptionOperation() : Operation(SubscriptionOperationExecutor.UP
8181
setEnumProperty(::status.name, value)
8282
}
8383

84+
/**
85+
* The jwt token used for the operation that updates a subscription.
86+
*/
87+
var jwt: String?
88+
get() = getStringProperty(::jwt.name)
89+
private set(value) {
90+
if (value != null) {
91+
setStringProperty(::jwt.name, value!!)
92+
}
93+
}
94+
8495
override val createComparisonKey: String get() = "$appId.User.$onesignalId"
8596
override val modifyComparisonKey: String get() = "$appId.User.$onesignalId.Subscription.$subscriptionId"
8697
override val groupComparisonType: GroupComparisonType = GroupComparisonType.ALTER
8798
override val canStartExecute: Boolean get() = !IDManager.isLocalId(onesignalId) && !IDManager.isLocalId(subscriptionId)
8899
override val applyToRecordId: String get() = subscriptionId
89100

90-
constructor(appId: String, onesignalId: String, subscriptionId: String, type: SubscriptionType, enabled: Boolean, address: String, status: SubscriptionStatus) : this() {
101+
constructor(appId: String, onesignalId: String, subscriptionId: String, type: SubscriptionType, enabled: Boolean, address: String, status: SubscriptionStatus, jwt: String? = null) : this() {
91102
this.appId = appId
92103
this.onesignalId = onesignalId
93104
this.subscriptionId = subscriptionId
94105
this.type = type
95106
this.enabled = enabled
96107
this.address = address
97108
this.status = status
109+
this.jwt = jwt
98110
}
99111

100112
override fun translateIds(map: Map<String, String>) {

0 commit comments

Comments
 (0)