Warning, /pim/kdepim-runtime/resources/tomboynotes/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 Notes to contributors:
0008 
0009    * Please follow the coding style of the existing source
0010    * Code contributions are released under Simplified BSD License, as specified in LICENSE. Do not contribute if this license does not suit your code
0011 
0012 ## Classes
0013 
0014 Class | Header | Purpose
0015 :-- | :-- | :--
0016 O0AbstractStore | o0abstractstore.h | Base class of persistent stores
0017 O0BaseAuth | o0baseauth.h | Base class of OAuth authenticators
0018 O0SettingsStore | o2settingsstore.h | QSettings-based persistent store
0019 O0SimpleCrypt | o0simplecrypt.h | Simple encryption and decryption by Andre Somers
0020 O1 | o1.h | Generic OAuth 1.0 authenticator
0021 O1Dropbox | o1dropbox.h | Dropbox OAuth specialization
0022 O1Flickr | o1flickr.h | Flickr OAuth specialization
0023 O1Freshbooks | o1freshbooks.h | Freshbooks OAuth specialization
0024 O1Requestor | o1requestor.h | Makes authenticated OAuth 1.0 requests: GET, POST or PUT, handles timeouts
0025 O1RequestParameter | o1.h | An extra request parameter participating in request signing
0026 O1Twitter | o1twitter.h | Twitter OAuth specialization
0027 O2 | o2.h | Generic OAuth 2.0 authenticator
0028 O2Facebook | o2facebook.h | Facebook OAuth specialization
0029 O2Gft | o2gft.h | Google Fusion Tables OAuth specialization
0030 O2Hubic | o2hubic.h | Hubic OAuth specialization
0031 O2Reply | o2reply.h | A network request/reply that can time out
0032 O2ReplyServer | o2replyserver.h | HTTP server to process authentication responses
0033 O2Requestor | o2requestor.h | Makes authenticated OAuth 2.0 requests (GET, POST or PUT), handles timeouts and token expiry
0034 O2Skydrive | o2skydrive.h | OneDrive OAuth specialization
0035 O2SurveyMonkey | o2surveymonkey.h | SurveyMonkey OAuth specialization
0036 OXTwitter | oxtwitter.h | Twitter XAuth specialization
0037 
0038 ## Installation
0039 
0040 Clone the Github repository, then add all files in *src* to your Qt project, by including *src/src.pri*.
0041 
0042 ## Basic Usage
0043 
0044 This example assumes a hypothetical Twitter client that will post tweets. Twitter is using OAuth 1.0.
0045 
0046 ### Setup
0047 
0048 Include the required header files, and have some member variables that will be used for authentication and sending requests:
0049 
0050     #include "o1twitter.h"
0051     #include "o1requestor.h"
0052     O1Twitter *o1;
0053 
0054 ### Initialization
0055 
0056 Instantiate one of the authenticator classes, like O1Twitter, set your application ID and application secret, and install the signal handlers:
0057 
0058     o1 = new O1Twitter(this);
0059     o1->setClientId(MY_CLIENT_ID);
0060     o1->setClientSecret(MY_CLIENT_SECRET);
0061     connect(o1, SIGNAL(linkedChanged()), this, SLOT(onLinkedChanged()));
0062     connect(o1, SIGNAL(linkingFailed()), this, SLOT(onLinkingFailed()));
0063     connect(o1, SIGNAL(linkingSucceeded()), this, SLOT(onLinkingSucceeded()));
0064     connect(o1, SIGNAL(openBrowser(QUrl)), this, SLOT(onOpenBrowser(QUrl)));
0065     connect(o1, SIGNAL(closeBrowser()), this, SLOT(onCloseBrowser()));
0066 
0067 **Note:** For browserless Twitter authentication, you can use the OXTwitter specialized class which can do Twitter XAuth. You will need to additionally provide your Twitter login credentials (username & password) before calling *link()*.
0068 
0069 ### Handling Signals
0070 
0071 O2 is an asynchronous library. It will send signals at various stages of authentication and request processing.
0072 
0073 To handle these signals, implement the following slots in your code:
0074 
0075     void onLinkedChanged() {
0076         // Linking (login) state has changed.
0077         // Use o1->linked() to get the actual state
0078     }
0079 
0080     void onLinkingFailed() {
0081         // Login has failed
0082     }
0083 
0084     void onLinkingSucceeded() {
0085         // Login has succeeded
0086     }
0087 
0088     void onOpenBrowser(const QUrl *url) {
0089         // Open a web browser or a web view with the given URL.
0090         // The user will interact with this browser window to
0091         // enter login name, password, and authorize your application
0092         // to access the Twitter account
0093     }
0094 
0095     void onCloseBrowser() {
0096         // Close the browser window opened in openBrowser()
0097     }
0098 
0099 ### Logging In
0100 
0101 To log in (e.g. to link your application to the OAuth service), call the link() method:
0102 
0103     o1->link();
0104 
0105 This initiates the authentication sequence. Your signal handlers above will be called at various stages. Lastly, if linking succeeds, onLinkingSucceeded() will be called.
0106 
0107 ### Logging Out
0108 
0109 To log out, call the unlink() method:
0110 
0111     o1->unlink();
0112 
0113 Logging out always succeeds, and requires no user interaction.
0114 
0115 ### Sending Authenticated Requests
0116 
0117 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'.
0118 
0119 First we need a Qt network manager and an O1 requestor object:
0120 
0121     QNetworkAccessManager *manager = new QNetworkAccessManager(this);
0122     O1Requestor *requestor = new O1Requestor(manager, o1, this);
0123 
0124 Next, create parameters for posting the update:
0125 
0126     QByteArray paramName("status");
0127     QByteArray tweetText("My first tweet!");
0128 
0129     QList<O1RequestParameter> requestParams = QList<O1RequestParameter>();
0130     requestParams << O1RequestParameter(paramName, tweetText);
0131 
0132     QByteArray postData = O1::createQueryParams(requestParams);
0133 
0134     // Using Twitter's REST API ver 1.1
0135     QUrl url = QUrl("https://api.twitter.com/1.1/statuses/update.json");
0136 
0137     QNetworkRequest request(url);
0138     request.setHeader(QNetworkRequest::ContentTypeHeader, O2_MIME_TYPE_XFORM);
0139 
0140 Finally we authenticate and send the request using the O1 requestor object:
0141 
0142     QNetworkReply *reply = requestor->post(request, reqestParams, postData);
0143 
0144 Continuing with the example, we will now send a tweet containing an image as well as a message.
0145 
0146 We create an HTTP request containing the image and the message, in the format specified by Twitter:
0147 
0148     QString imagePath("/tmp/image.jpg");
0149     QString message("My tweet with an image!");
0150 
0151     QFileInfo fileInfo(imagePath);
0152     QFile file(imagePath);
0153     file.open(QIODevice::ReadOnly);
0154 
0155     QString boundary("7d44e178b0439");
0156     QByteArray data(QString("--" + boundary + "\r\n").toAscii());
0157     data += "Content-Disposition: form-data; name=\"media[]\"; filename=\"" + fileInfo.fileName() + "\"\r\n";
0158     data += "Content-Transfer-Encoding: binary\r\n";
0159     data += "Content-Type: application/octet-stream\r\n\r\n";
0160     data += file.readAll();
0161     file.close();
0162     data += QString("\r\n--") + boundary + "\r\n";
0163     data += "Content-Disposition: form-data; name=\"status\"\r\n";
0164     data += "Content-Transfer-Encoding: binary\r\n";
0165     data += "Content-Type: text/plain; charset=utf-8\r\n\r\n";
0166     data += message.toUtf8();
0167     data += QString("\r\n--") + boundary + "--\r\n";
0168 
0169     QNetworkRequest request;
0170     // Using Twitter's REST API ver 1.1
0171     request.setUrl(QUrl("https://api.twitter.com/1.1/statuses/update_with_media.json"));
0172     request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + boundary);
0173     request.setHeader(QNetworkRequest::ContentLengthHeader, data.length());
0174 
0175     QNetworkReply *reply = requestor->post(request, QList<O1RequestParameter>(), data);
0176 
0177 That's it. Tweets using the O2 library!
0178 
0179 ### Storing OAuth Tokens
0180 
0181 O2 provides simple storage classes for writing OAuth tokens in a persistent location. Currently, a QSettings based backing store **O2SettingsStore** 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:
0182 
0183     O0SettingsStore settings = new O0SettingsStore("myencryptionkey");
0184     // Set the store before starting OAuth, i.e before calling link()
0185     o1->setStore(settings);
0186     ...
0187 
0188 You can also create it with your customized QSettings object. O2SettingsStore will then use that QSettings object for storing the tokens:
0189 
0190     O0SettingsStore settings = new O0SettingsStore(mySettingsObject, "myencryptionkey");
0191 
0192 Once set, O2SettingsStore takes ownership of the QSettings object.
0193 
0194 **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.
0195 
0196 ### Extra OAuth Tokens
0197 
0198 Some OAuth service providers provide additional information in the access token response. Eg: Twitter returns 2 additional tokens in it's access token response - *screen_name* and *user_id*.
0199 
0200 O2 provides all 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.
0201 
0202 ## More Examples
0203 
0204 The *examples* folder contains complete example applications:
0205 
0206 Name | Description
0207 :-- | :--
0208 facebookdemo | Command line application authenticating with Facebook
0209 sialis | QT Quick Twitter client using OAuth 1
0210 twitterdemo | Command line client for authenticating with Twitter and posting status updates. Uses OAuth 1 or Twitter XAuth
0211 
0212