Warning, /graphics/digikam/core/libs/dplugins/webservices/o2/README.md is written in an unsupported language. File is not indexed.

0001 # OAuth 1.0 and 2.0 for Qt
0002 
0003 This library encapsulates the OAuth 1.0 and 2.0 client authentication flows, and the sending of authenticated HTTP requests.
0004 
0005 The primary target is Qt Quick applications on embedded devices.
0006 
0007 Supported Qt versions: 5 and 6.
0008 
0009 Notes to contributors:
0010 
0011    * Please follow the coding style of the existing source code
0012    * Code contributions are released under Simplified BSD License, as specified in LICENSE. Do not contribute if this license does not suit your code
0013 
0014 ## Classes
0015 
0016 Class | Header | Purpose
0017 :-- | :-- | :--
0018 O0AbstractStore | o0abstractstore.h | Base class of persistent stores
0019 O0BaseAuth | o0baseauth.h | Base class of OAuth authenticators
0020 O0SettingsStore | o0settingsstore.h | QSettings-based persistent store
0021 o0keyChainStore | o0keychainstore.h | Settings stored through the system keychain [keychain](https://github.com/frankosterfeld/qtkeychain)
0022 O0SimpleCrypt | o0simplecrypt.h | Simple encryption and decryption by Andre Somers
0023 O1 | o1.h | Generic OAuth 1.0 authenticator
0024 O1Dropbox | o1dropbox.h | Dropbox OAuth specialization
0025 O1Flickr | o1flickr.h | Flickr OAuth specialization
0026 O1Freshbooks | o1freshbooks.h | Freshbooks OAuth specialization
0027 O1Requestor | o1requestor.h | Makes authenticated OAuth 1.0 requests: GET, POST or PUT, handles timeouts
0028 O1RequestParameter | o1.h | An extra request parameter participating in request signing
0029 O1Twitter | o1twitter.h | Twitter OAuth specialization
0030 O1SmugMug | o1smugmug.h | SmugMug OAuth specialization
0031 O2 | o2.h | Generic OAuth 2.0 authenticator
0032 O2Facebook | o2facebook.h | Facebook OAuth specialization
0033 O2Gft | o2gft.h | Google Fusion Tables OAuth specialization
0034 O2Google | o2google.h | Google Oauth specialization [scopes](https://developers.google.com/identity/protocols/googlescopes)
0035 O2GoogleDevice | o2google.h | Google [Sign-In for TVs and Devices](https://developers.google.com/identity/sign-in/devices)
0036 O2Hubic | o2hubic.h | Hubic OAuth specialization
0037 O2Msgraph | o2msgraph.h | Microsoft Graph OAuth specialization
0038 O2Reply | o2reply.h | A network request/reply that can time out
0039 O2ReplyServer | o2replyserver.h | HTTP server to process authentication responses
0040 O2Requestor | o2requestor.h | Makes authenticated OAuth 2.0 requests (GET, POST or PUT), handles timeouts and token expiry
0041 O2Skydrive | o2skydrive.h | OneDrive OAuth specialization
0042 O2SurveyMonkey | o2surveymonkey.h | SurveyMonkey OAuth specialization
0043 OXTwitter | oxtwitter.h | Twitter XAuth specialization
0044 O2Uber | o2uber.h | Uber OAuth specialization
0045 
0046 ## Installation
0047 
0048 Clone the Github repository, then add all files in *src* to your Qt project, by including *src/src.pri*.
0049 
0050 ## Basic Usage
0051 
0052 This example assumes a hypothetical Twitter client that will post tweets. Twitter is using OAuth 1.0.
0053 
0054 ### Setup
0055 
0056 Include the required header files, and have some member variables that will be used for authentication and sending requests:
0057 
0058 ```c++
0059 #include "o1twitter.h"
0060 #include "o1requestor.h"
0061 O1Twitter *o1;
0062 ```
0063 
0064 ### Initialization
0065 
0066 Instantiate one of the authenticator classes, like O1Twitter, set your application ID and application secret, and install the signal handlers:
0067 
0068 ```c++
0069 o1 = new O1Twitter(this);
0070 o1->setClientId(MY_CLIENT_ID);
0071 o1->setClientSecret(MY_CLIENT_SECRET);
0072 connect(o1, SIGNAL(linkedChanged()), this, SLOT(onLinkedChanged()));
0073 connect(o1, SIGNAL(linkingFailed()), this, SLOT(onLinkingFailed()));
0074 connect(o1, SIGNAL(linkingSucceeded()), this, SLOT(onLinkingSucceeded()));
0075 connect(o1, SIGNAL(openBrowser(QUrl)), this, SLOT(onOpenBrowser(QUrl)));
0076 connect(o1, SIGNAL(closeBrowser()), this, SLOT(onCloseBrowser()));
0077 ```
0078 
0079 **Note:** For browserless Twitter authentication, you can use the OXTwitter specialized class that can do Twitter XAuth. You will need to additionally provide your Twitter login credentials (username & password) before calling *link()*.
0080 
0081 ### Handling Signals
0082 
0083 O2 is an asynchronous library. It will send signals at various stages of authentication and request processing.
0084 
0085 To handle these signals, implement the following slots in your code:
0086 
0087 ```c++
0088 void onLinkedChanged() {
0089     // Linking (login) state has changed.
0090     // Use o1->linked() to get the actual state
0091 }
0092 
0093 void onLinkingFailed() {
0094     // Login has failed
0095 }
0096 
0097 void onLinkingSucceeded() {
0098     // Login has succeeded
0099 }
0100 
0101 void onOpenBrowser(const QUrl *url) {
0102     // Open a web browser or a web view with the given URL.
0103     // The user will interact with this browser window to
0104     // enter login name, password, and authorize your application
0105     // to access the Twitter account
0106 }
0107 
0108 void onCloseBrowser() {
0109     // Close the browser window opened in openBrowser()
0110 }
0111 ```
0112 
0113 **Note:** From _onOpenBrowser_, prefer opening a web view, instead of a full-blown external browser.
0114 
0115 **Note:** If you _must_ use an external browser on Android, change this line in the Qt-generated manifest.xml:
0116 
0117 ```meta-data android:name="android.app.background_running" android:value="true"```
0118 
0119 
0120 ### Logging In
0121 
0122 To log in (e.g. to link your application to the OAuth service), call the link() method:
0123 
0124 ```c++
0125 o1->link();
0126 ```
0127 
0128 This initiates the authentication sequence. Your signal handlers above will be called at various stages. Lastly, if linking succeeds, onLinkingSucceeded() will be called.
0129 
0130 ### Logging Out
0131 
0132 To log out, call the unlink() method:
0133 
0134 ```c++
0135 o1->unlink();
0136 ```
0137 
0138 Logging out always succeeds, and requires no user interaction.
0139 
0140 ### Sending Authenticated Requests
0141 
0142 Once linked, you can start sending authenticated requests to the service. We start with a simple example of sending a text-only tweet or as it's known in Twitter docs, a 'status update'.
0143 
0144 First we need a Qt network manager and an O1 requestor object:
0145 
0146 ```c++
0147 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
0148 O1Requestor *requestor = new O1Requestor(manager, o1, this);
0149 ```
0150 
0151 Next, create parameters for posting the update:
0152 
0153 ```c++
0154 QByteArray paramName("status");
0155 QByteArray tweetText("My first tweet!");
0156 
0157 QList<O1RequestParameter> requestParams = QList<O1RequestParameter>();
0158 requestParams << O1RequestParameter(paramName, tweetText);
0159 
0160 QByteArray postData = O1::createQueryParams(requestParams);
0161 
0162 // Using Twitter's REST API ver 1.1
0163 QUrl url = QUrl("https://api.twitter.com/1.1/statuses/update.json");
0164 
0165 QNetworkRequest request(url);
0166 request.setHeader(QNetworkRequest::ContentTypeHeader, O2_MIME_TYPE_XFORM);
0167 ```
0168 
0169 Finally we authenticate and send the request using the O1 requestor object:
0170 
0171 ```c++
0172 QNetworkReply *reply = requestor->post(request, reqestParams, postData);
0173 ```
0174 
0175 Continuing with the example, we will now send a tweet containing an image as well as a message.
0176 
0177 We create an HTTP request containing the image and the message, in the format specified by Twitter:
0178 
0179 ```c++
0180 QString imagePath("/tmp/image.jpg");
0181 QString message("My tweet with an image!");
0182 
0183 QFileInfo fileInfo(imagePath);
0184 QFile file(imagePath);
0185 file.open(QIODevice::ReadOnly);
0186 
0187 QString boundary("7d44e178b0439");
0188 QByteArray data(QString("--" + boundary + "\r\n").toAscii());
0189 data += "Content-Disposition: form-data; name=\"media[]\"; filename=\"" + fileInfo.fileName() + "\"\r\n";
0190 data += "Content-Transfer-Encoding: binary\r\n";
0191 data += "Content-Type: application/octet-stream\r\n\r\n";
0192 data += file.readAll();
0193 file.close();
0194 data += QString("\r\n--") + boundary + "\r\n";
0195 data += "Content-Disposition: form-data; name=\"status\"\r\n";
0196 data += "Content-Transfer-Encoding: binary\r\n";
0197 data += "Content-Type: text/plain; charset=utf-8\r\n\r\n";
0198 data += message.toUtf8();
0199 data += QString("\r\n--") + boundary + "--\r\n";
0200 
0201 QNetworkRequest request;
0202 // Using Twitter's REST API ver 1.1
0203 request.setUrl(QUrl("https://api.twitter.com/1.1/statuses/update_with_media.json"));
0204 request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + boundary);
0205 request.setHeader(QNetworkRequest::ContentLengthHeader, data.length());
0206 
0207 QNetworkReply *reply = requestor->post(request, QList<O1RequestParameter>(), data);
0208 ```
0209 
0210 That's it. Tweets using the O2 library!
0211 
0212 ### Storing OAuth Tokens
0213 
0214 O2 provides simple storage classes for writing OAuth tokens in a peristent location. Currently, a QSettings based backing store **O0SettingsStore** is provided in O2. O2SettingsStore keeps all token values in an encrypted form. You have to specify the encryption key to use while constructing the object:
0215 
0216 ```c++
0217 O0SettingsStore *settings = new O0SettingsStore("myencryptionkey");
0218 // Set the store before starting OAuth, i.e before calling link()
0219 o1->setStore(settings);
0220 // ...
0221 ```
0222 
0223 Once set, the O0BaseAuth takes ownership of the O0SettingsStore object.
0224 
0225 You can also create it with your customized QSettings object. O2SettingsStore will then use that QSettings object for storing the tokens:
0226 
0227 ```c++
0228 O0SettingsStore *settings = new O0SettingsStore(mySettingsObject, "myencryptionkey");
0229 ```
0230 
0231 Once set, O2SettingsStore takes ownership of the QSettings object.
0232 
0233 **Note:** If you do not specify a storage object to use, O2 will create one by default (which QSettings based), and use it. In such a case, a default encryption key is used for encrypting the data. *This is not a secure solution: prefer storing the tokens in a Keychain or Wallet based facility instead*.
0234 
0235 **Note:** If using O2SettingsStore, make sure organization name, domain and application name are set:
0236 
0237 ```c++
0238 QCoreApplication::setOrganizationName("MySoft");
0239 QCoreApplication::setOrganizationDomain("mysoft.com");
0240 QCoreApplication::setApplicationName("Star Runner");
0241 ```
0242 
0243 ### Extra OAuth Tokens
0244 
0245 Some OAuth services provide additional information in the access token response. For example Twitter returns two additional tokens: *screen_name* and *user_id*.
0246 
0247 O2 exposes such tokens via the property *extraTokens*. You can query this property after a successful OAuth exchange, i.e after the *linkingSucceeded()* signal has been emitted.
0248 
0249 ## More Examples
0250 
0251 The *examples* folder contains complete example applications:
0252 
0253 Name | Description
0254 :-- | :--
0255 facebookdemo | Command line application authenticating with Facebook
0256 sialis | QT Quick Twitter client using OAuth 1
0257 twitterdemo | Command line client for authenticating with Twitter and posting status updates. Uses OAuth 1 or Twitter XAuth
0258 
0259 ## Change Log
0260 
0261 ### 1.0.2
0262 
0263 * Last Qt5-only release
0264 
0265 ### 0.1.0
0266 
0267 * Persist the extra tokens, too
0268 * Add Qt Quick Twitter client example