diff --git a/.gitignore b/.gitignore index 7e68f46..8788d6d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ Packages.dgml Release sdk-build.log project.lock.json +winsdkfb/winsdkfb_uwp/UpgradeLog.htm diff --git a/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp b/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp index 239fb1d..6106124 100644 --- a/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp +++ b/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp @@ -105,7 +105,7 @@ BOOL MainPage::DidGetAllRequestedPermissions( BOOL success = FALSE; FBAccessTokenData^ data = FBSession::ActiveSession->AccessTokenData; - if (data) + if (data && data->DeclinedPermissions) { success = !data->DeclinedPermissions->Values->Size; } diff --git a/samples/LoginCpp-UWP/LoginCpp/Resources.resw b/samples/LoginCpp-UWP/LoginCpp/Resources.resw index 83ee551..64021f8 100644 --- a/samples/LoginCpp-UWP/LoginCpp/Resources.resw +++ b/samples/LoginCpp-UWP/LoginCpp/Resources.resw @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 1606735379540755 + 519296541448237 Facebook Application ID diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp index dc2cfef..6d533da 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp @@ -47,6 +47,9 @@ FBAccessTokenData::FBAccessTokenData( #ifdef _DEBUG DebugPrintExpirationTime(); #endif + + std::wstring wsAccessToken(AccessToken->Data()); + _graphDomain = (wsAccessToken.substr(0, 2) == L"GG") ? L"gaming" : L"facebook"; } FBAccessTokenData::FBAccessTokenData( @@ -64,6 +67,9 @@ FBAccessTokenData::FBAccessTokenData( Vector^ v = ref new Vector(0); _grantedPermissions = ref new FBPermissions(v->GetView()); _declinedPermissions = ref new FBPermissions(v->GetView()); + + std::wstring wsAccessToken(AccessToken->Data()); + _graphDomain = (wsAccessToken.substr(0, 2) == L"GG") ? L"gaming" : L"facebook"; } String^ FBAccessTokenData::AccessToken::get() @@ -71,6 +77,11 @@ String^ FBAccessTokenData::AccessToken::get() return _accessToken; } +String^ FBAccessTokenData::GraphDomain::get() +{ + return _graphDomain; +} + DateTime FBAccessTokenData::ExpirationDate::get() { return _expirationDate; diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h index 3df957d..40860a4 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h @@ -50,6 +50,14 @@ namespace winsdkfb Platform::String^ get(); } + /** + * Graph domain should be used for current access token. + */ + property Platform::String^ GraphDomain + { + Platform::String^ get(); + } + /** * Expiration date of the access token. */ @@ -119,6 +127,7 @@ namespace winsdkfb #endif Platform::String^ _accessToken; + Platform::String^ _graphDomain; Windows::Foundation::DateTime _expirationDate; FBPermissions^ _grantedPermissions; FBPermissions^ _declinedPermissions; diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp index 8d12db0..557b3cf 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp @@ -398,8 +398,8 @@ Uri^ FBClient::PrepareRequestUri( PropertySet^ parameters ) { + String^ graphDomain = L"facebook"; FBSession^ sess = FBSession::ActiveSession; - GraphUriBuilder^ uriBuilder = ref new GraphUriBuilder(path); if (parameters == nullptr) { @@ -427,11 +427,24 @@ Uri^ FBClient::PrepareRequestUri( sess->AccessTokenData->AccessToken); } + // For applications using Facebook Login for Gaming, graph API requests + // should be sent to different graph domain: graph.fb.gg + if (parametersWithoutMediaObjects->HasKey("access_token")) + { + String^ accessToken = safe_cast(parametersWithoutMediaObjects->Lookup("access_token")); + std::wstring wsAccessToken(accessToken->Data()); + if ((wsAccessToken.substr(0, 2) == L"GG")) + { + graphDomain = L"gaming"; + } + } + if (parametersWithoutMediaObjects->HasKey("format")) { parametersWithoutMediaObjects->Insert("format", "json-strings"); } + GraphUriBuilder^ uriBuilder = ref new GraphUriBuilder(path, graphDomain); SerializeParameters(parametersWithoutMediaObjects); // Add remaining parameters to query string. Note that parameters that diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp index fe30e62..4716afa 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp @@ -209,8 +209,16 @@ task FBSession::GetUserInfo( ) { PropertySet^ parameters = ref new PropertySet(); - parameters->Insert(L"fields", - L"gender,link,first_name,last_name,locale,timezone,email,updated_time,verified,name,id,picture"); + if (TokenData->GraphDomain == L"gaming") + { + parameters->Insert(L"fields", L"link,email,name,id,picture"); + } + else + { + parameters->Insert(L"fields", + L"gender,link,first_name,last_name,locale,timezone,email,updated_time,verified,name,id,picture"); + } + FBSingleValue^ value = ref new FBSingleValue( "/me", parameters, @@ -1326,7 +1334,9 @@ int FBSession::APIMinorVersion::get() void FBSession::SaveGrantedPermissions() { auto values =FBSession::DataContainer->Values; - values->Insert(GRANTED_PERMISSIONS_KEY, AccessTokenData->GrantedPermissions->ToString()); + if (AccessTokenData->GrantedPermissions != nullptr) { + values->Insert(GRANTED_PERMISSIONS_KEY, this->_AccessTokenData->GrantedPermissions->ToString()); + } } String^ FBSession::GetGrantedPermissions() diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp index 0b17f0b..0daceea 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp @@ -27,7 +27,7 @@ using namespace Windows::Foundation::Collections; using namespace winsdkfb; -GraphUriBuilder::GraphUriBuilder(String^ path) +GraphUriBuilder::GraphUriBuilder(String^ path, String^ graphDomain) : _queryParams { ref new PropertySet() } { @@ -45,6 +45,10 @@ GraphUriBuilder::GraphUriBuilder(String^ path) if (buildDomain) { String^ domain = L"https://graph.facebook.com/"; + if (graphDomain == L"gaming") + { + domain = L"https://graph.fb.gg/"; + } testUri = ref new Uri(domain + path); } _host = testUri->Host; diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h index 18971c5..eb452ae 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h @@ -23,7 +23,7 @@ namespace winsdkfb public ref class GraphUriBuilder sealed { public: - GraphUriBuilder(Platform::String^ path); + GraphUriBuilder(Platform::String^ path, Platform::String^ graphDomain); Windows::Foundation::Uri^ MakeUri(); void AddQueryParam(Platform::String^ query, Platform::String^ param);