Skip to content

Commit 5911836

Browse files
committed
Implement token refresh
1 parent 14b1bb0 commit 5911836

File tree

3 files changed

+60
-18
lines changed

3 files changed

+60
-18
lines changed

Source/CesiumRuntime/Private/Cesium3DTileset.cpp

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
#include "Async/Async.h"
55
#include "Camera/CameraTypes.h"
66
#include "Camera/PlayerCameraManager.h"
7+
#include "Cesium3DTilesSelection/CesiumIonTilesetContentLoaderFactory.h"
78
#include "Cesium3DTilesSelection/EllipsoidTilesetLoader.h"
9+
#include "Cesium3DTilesSelection/IModelMeshExportContentLoaderFactory.h"
10+
#include "Cesium3DTilesSelection/ITwinCesiumCuratedContentLoaderFactory.h"
11+
#include "Cesium3DTilesSelection/ITwinRealityDataContentLoaderFactory.h"
812
#include "Cesium3DTilesSelection/Tile.h"
913
#include "Cesium3DTilesSelection/TilesetLoadFailureDetails.h"
1014
#include "Cesium3DTilesSelection/TilesetOptions.h"
1115
#include "Cesium3DTilesSelection/TilesetSharedAssetSystem.h"
12-
#include "Cesium3DTilesSelection/CesiumIonTilesetContentLoaderFactory.h"
13-
#include "Cesium3DTilesSelection/IModelMeshExportContentLoaderFactory.h"
14-
#include "Cesium3DTilesSelection/ITwinCesiumCuratedContentLoaderFactory.h"
15-
#include "Cesium3DTilesSelection/ITwinRealityDataContentLoaderFactory.h"
1616
#include "Cesium3DTilesetLoadFailureDetails.h"
1717
#include "Cesium3DTilesetRoot.h"
1818
#include "CesiumActors.h"
@@ -473,14 +473,15 @@ void ACesium3DTileset::SetITwinID(const FString& InITwinID) {
473473
}
474474
}
475475

476-
void ACesium3DTileset::SetITwinAccessToken(const FString& InAccessToken) {
477-
if (this->ITwinAccessToken != InAccessToken) {
476+
void ACesium3DTileset::SetITwinConnection(
477+
UCesiumITwinConnection* InConnection) {
478+
if (this->ITwinConnection != InConnection) {
478479
if (this->TilesetSource == ETilesetSource::FromITwinCesiumCuratedContent ||
479480
this->TilesetSource == ETilesetSource::FromIModelMeshExportService ||
480481
this->TilesetSource == ETilesetSource::FromITwinRealityData) {
481482
this->DestroyTileset();
482483
}
483-
this->ITwinAccessToken = InAccessToken;
484+
this->ITwinConnection = InConnection;
484485
}
485486
}
486487

@@ -1196,7 +1197,9 @@ void ACesium3DTileset::LoadTileset() {
11961197
externals,
11971198
Cesium3DTilesSelection::ITwinCesiumCuratedContentLoaderFactory(
11981199
static_cast<uint32_t>(this->ITwinCesiumContentID),
1199-
TCHAR_TO_UTF8(*this->ITwinAccessToken)),
1200+
this->ITwinConnection->GetConnection()
1201+
->getAccessToken()
1202+
.getToken()),
12001203
options);
12011204
break;
12021205
case ETilesetSource::FromIModelMeshExportService:
@@ -1211,7 +1214,9 @@ void ACesium3DTileset::LoadTileset() {
12111214
Cesium3DTilesSelection::IModelMeshExportContentLoaderFactory(
12121215
TCHAR_TO_UTF8(*this->IModelID),
12131216
std::nullopt,
1214-
TCHAR_TO_UTF8(*this->ITwinAccessToken)),
1217+
this->ITwinConnection->GetConnection()
1218+
->getAccessToken()
1219+
.getToken()),
12151220
options);
12161221
break;
12171222
case ETilesetSource::FromITwinRealityData:
@@ -1228,9 +1233,33 @@ void ACesium3DTileset::LoadTileset() {
12281233
this->ITwinID.IsEmpty() ? std::nullopt
12291234
: std::make_optional<std::string>(
12301235
TCHAR_TO_UTF8(*this->ITwinID)),
1231-
TCHAR_TO_UTF8(*this->ITwinAccessToken),
1232-
[asyncSystem](const std::string&) {
1233-
return asyncSystem.createResolvedFuture<CesiumUtility::Result<std::string>>(CesiumUtility::Result<std::string>(std::string{}));
1236+
this->ITwinConnection->GetConnection()->getAccessToken().getToken(),
1237+
[asyncSystem, pConnection = this->ITwinConnection->GetConnection()](
1238+
const std::string&) {
1239+
if (!pConnection->getRefreshToken()) {
1240+
return asyncSystem.createResolvedFuture<
1241+
CesiumUtility::
1242+
Result<std::string>>(CesiumUtility::ErrorList::error(
1243+
"Access token for reality data is expired, no refresh token available."));
1244+
}
1245+
1246+
return pConnection->me().thenImmediately(
1247+
[pConnection](
1248+
CesiumUtility::Result<CesiumITwinClient::UserProfile>&&
1249+
result) -> CesiumUtility::Result<std::string> {
1250+
if (!result.value) {
1251+
return CesiumUtility::Result<std::string>(result.errors);
1252+
}
1253+
1254+
if (!pConnection->getAccessToken().isValid()) {
1255+
return CesiumUtility::Result<
1256+
std::string>(CesiumUtility::ErrorList::error(
1257+
"Tried to refresh access token for reality data, but was not able to obtain valid token."));
1258+
}
1259+
1260+
return CesiumUtility::Result<std::string>(
1261+
pConnection->getAccessToken().getToken());
1262+
});
12341263
}),
12351264
options);
12361265
break;
@@ -2346,7 +2375,7 @@ void ACesium3DTileset::PostEditChangeProperty(
23462375
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, IModelID) ||
23472376
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, RealityDataID) ||
23482377
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, ITwinID) ||
2349-
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, ITwinAccessToken) ||
2378+
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, ITwinConnection) ||
23502379
PropName ==
23512380
GET_MEMBER_NAME_CHECKED(ACesium3DTileset, CreatePhysicsMeshes) ||
23522381
PropName ==

Source/CesiumRuntime/Public/Cesium3DTileset.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "CesiumEncodedMetadataComponent.h"
1111
#include "CesiumFeaturesMetadataComponent.h"
1212
#include "CesiumGeoreference.h"
13+
#include "CesiumITwinAPIBlueprintLibrary.h"
1314
#include "CesiumIonServer.h"
1415
#include "CesiumPointCloudShading.h"
1516
#include "CesiumSampleHeightResult.h"
@@ -857,13 +858,13 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor {
857858
*/
858859
UPROPERTY(
859860
EditAnywhere,
860-
BlueprintGetter = GetITwinAccessToken,
861-
BlueprintSetter = SetITwinAccessToken,
861+
BlueprintGetter = GetITwinConnection,
862+
BlueprintSetter = SetITwinConnection,
862863
Category = "Cesium",
863864
meta =
864865
(EditCondition =
865866
"TilesetSource==ETilesetSource::FromITwinCesiumCuratedContent || TilesetSource==ETilesetSource::FromIModelMeshExportService || TilesetSource==ETilesetSource::FromITwinRealityData"))
866-
FString ITwinAccessToken;
867+
UCesiumITwinConnection* ITwinConnection;
867868

868869
/**
869870
* Headers to be attached to each request made for this tileset.
@@ -1164,10 +1165,12 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor {
11641165
void SetITwinID(const FString& InITwinID);
11651166

11661167
UFUNCTION(BlueprintGetter, Category = "Cesium")
1167-
FString GetITwinAccessToken() const { return ITwinAccessToken; }
1168+
UCesiumITwinConnection* GetITwinAccessToken() const {
1169+
return ITwinConnection;
1170+
}
11681171

11691172
UFUNCTION(BlueprintSetter, Category = "Cesium")
1170-
void SetITwinAccessToken(const FString& InAccessToken);
1173+
void SetITwinConnection(UCesiumITwinConnection* InAccessToken);
11711174

11721175
UFUNCTION(BlueprintGetter, Category = "VirtualTexture")
11731176
TArray<URuntimeVirtualTexture*> GetRuntimeVirtualTextures() const {

Source/CesiumRuntime/Public/CesiumITwinAPIBlueprintLibrary.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ class UCesiumITwinConnection : public UObject {
6161
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Cesium|iTwin")
6262
bool IsValid() { return this->pConnection != nullptr; }
6363

64+
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Cesium|iTwin")
65+
FString GetAccessToken() {
66+
return UTF8_TO_TCHAR(
67+
this->pConnection->getAccessToken().getToken().c_str());
68+
}
69+
70+
TSharedPtr<CesiumITwinClient::Connection>& GetConnection() {
71+
return this->pConnection;
72+
}
73+
6474
void SetConnection(TSharedPtr<CesiumITwinClient::Connection> pConnection) {
6575
this->pConnection = pConnection;
6676
}

0 commit comments

Comments
 (0)