spectrum2/3rdparty/cpprestsdk/samples/FacebookDemo/Facebook.cpp
2015-11-19 15:19:14 +01:00

148 lines
No EOL
4.9 KiB
C++

/***
* ==++==
*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* ==--==
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
*
* Facebook.cpp - Implementation file for simple facebook client.
* Note: this implementation will not work until you replace the placeholder
* strings below with tokens obtained from facebook.
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
****/
#include "pch.h"
#include "facebook.h"
using namespace pplx;
using namespace web;
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Security::Authentication::Web;
using namespace Windows::Storage;
// Placeholder strings for app tokens
// see blog post at http://aka.ms/FacebookCppRest
// for information on obtaining these values
const std::wstring application_id(L"insert your application ID");
const std::wstring application_token(L"insert your application token");
facebook_client& facebook_client::instance()
{
static facebook_client c;
return c;
}
pplx::task<void> facebook_client::login(std::wstring scopes)
{
// Look in the Local Settings for previously-stored login credentials
auto ls = ApplicationData::Current->LocalSettings->CreateContainer("LoginDetailsCache",
ApplicationDataCreateDisposition::Always);
if(ls->Values->HasKey("facebookToken")) {
token_ = dynamic_cast<String^>(ls->Values->Lookup("facebookToken"))->Data();
}
if(!token_.empty()) {
// Check if the token is still valid
using namespace http;
uri_builder tokendbg_uri(L"/debug_token");
tokendbg_uri.append_query(L"input_token", token_);
tokendbg_uri.append_query(L"access_token", application_token);
http_request request(methods::GET);
request.set_request_uri(tokendbg_uri.to_string());
request.headers().add(header_names::accept, L"application/json");
return raw_client.request(request)
.then([](http_response response){
return response.extract_json();
}).then([=](json::value v) -> task<void> {
auto obj = v[L"data"];
if(obj[L"is_valid"].as_bool()) {
// Currently cached access token is valid
signed_in = true;
return create_task([](){}); // Return an empty task to match the function's return value
}
// If the token was invalid, go through full login
return full_login(scopes);
}, task_continuation_context::use_current());
}
// If no token was found, go through full login
return full_login(scopes);
}
pplx::task<void> facebook_client::full_login(std::wstring scopes)
{
// Create uri for OAuth login on Facebook
http::uri_builder login_uri(L"https://www.facebook.com/dialog/oauth");
login_uri.append_query(L"client_id", application_id); // App id
login_uri.append_query(L"redirect_uri", L"https://www.facebook.com/connect/login_success.html");
login_uri.append_query(L"scope", scopes);
login_uri.append_query(L"display", L"popup");
login_uri.append_query(L"response_type", L"token");
return create_task(WebAuthenticationBroker::AuthenticateAsync(
WebAuthenticationOptions::None, ref new Uri(ref new String(login_uri.to_string().c_str())),
ref new Uri("https://www.facebook.com/connect/login_success.html")))
.then([=](WebAuthenticationResult^ result) {
if(result->ResponseStatus == WebAuthenticationStatus::Success)
{
signed_in = true;
std::wstring response(result->ResponseData->Data()); // Save authentication token
auto start = response.find(L"access_token=");
start += 13;
auto end = response.find('&');
token_ = response.substr(start, end-start);
// Add token to Local Settings for future login attempts
auto ls = ApplicationData::Current->LocalSettings->CreateContainer("LoginDetailsCache",
ApplicationDataCreateDisposition::Always);
ls->Values->Insert("facebookToken", ref new String(token_.c_str()));
}
});
}
task<json::value> facebook_client::get(std::wstring path)
{
using namespace http;
http_request request(methods::GET);
request.set_request_uri(base_uri().append_path(path).to_uri());
request.headers().add(header_names::accept, L"application/json");
return raw_client.request(request)
.then([](http_response response) {
return response.extract_json();
});
}
http::uri_builder facebook_client::base_uri(bool absolute)
{
http::uri_builder ret;
if(absolute)
ret.set_path(L"https://graph.facebook.com");
ret.append_query(L"access_token", token_);
return ret;
}