| 1 | |
| 2 | == Understanding OAuth 1.0a with Telldus Live! |
| 3 | |
| 4 | OAuth 1.0a is an authorization protocol that allows applications to access user data without exposing user credentials. |
| 5 | |
| 6 | You can access the Telldus Live! API using OAuth 1.0a for authenticating API requests. |
| 7 | |
| 8 | **OAuth 1.0a Flow** |
| 9 | |
| 10 | Request Token: Your application requests a temporary token from Telldus.\\ |
| 11 | User Authorization: Redirect the user to Telldus to authorize the application.\\ |
| 12 | Access Token: Exchange the temporary token for an access token.\\ |
| 13 | API Requests: Use the access token to make authenticated API requests.\\ |
| 14 | |
| 15 | **Telldus Live! OAuth Endpoints** |
| 16 | |
| 17 | These are the end points you will need to use to execute the OAuth 1.0a flow: |
| 18 | |
| 19 | Request Token: `https://pa-api.telldus.com/oauth/requestToken`\\ |
| 20 | Authorize Token: `https://pa-api.telldus.com/oauth/authorize`\\ |
| 21 | Access Token: `https://pa-api.telldus.com/oauth/accessToken`\\ |
| 22 | |
| 23 | API Calls: `https://pa-api.telldus.com/{format}/{function}`\\ |
| 24 | where {format} is either "xml" or "json", {function} is the function to call. Please see the [https://pa-api.telldus.com/explore/index Explorer] for a list of available functions. |
| 25 | |
| 26 | Calls can be made as either GET or POST\\ |
| 27 | For example. List of available devices and return the data as json:\\ |
| 28 | `curl -X GET "https://pa-api.telldus.com/devices/list?supportedMethods=3&format=json"` |
| 29 | |
| 30 | |
| 31 | **Python example for accessing the Telldus Live API** |
| 32 | |
| 33 | The following example shows a very basic implementation using Python to obtain a list of all clients and a list of all devices under your Telldus account. |
| 34 | |
| 35 | **Configuration** |
| 36 | |
| 37 | First let's define the OAuth consumer key and client secret. You can find both from [https://pa-api.telldus.com/keys/showToken here], they are called Public key and Private key respectively. |
| 38 | |
| 39 | We put all these into a configuration file, let's call it `config.py`: |
| 40 | {{{ |
| 41 | # Obtain the public and private key from https://pa-api.telldus.com/keys/showToken |
| 42 | CONSUMER_KEY = 'Public key' |
| 43 | CONSUMER_SECRET = 'Private key' |
| 44 | }}} |
| 45 | |
| 46 | Then the end points:\\ |
| 47 | |
| 48 | {{{ |
| 49 | # Defines the API end points |
| 50 | REQUEST_TOKEN_URL = 'https://pa-api.telldus.com/oauth/requestToken' |
| 51 | AUTHORIZE_URL = 'https://pa-api.telldus.com/oauth/authorize' |
| 52 | ACCESS_TOKEN_URL = 'https://pa-api.telldus.com/oauth/accessToken' |
| 53 | }}} |
| 54 | |
| 55 | For the main application, let's call it `app.py`. We will use the python module `requests_oauthlib` to facilitate the OAuth1.0a work flow. |
| 56 | |
| 57 | **app.py** |
| 58 | |
| 59 | First, we construct a function to setup and return an OAuth 1.0a session: |
| 60 | |
| 61 | {{{ |
| 62 | # OAuth1Session setup |
| 63 | def get_oauth_session(token=None, token_secret=None): |
| 64 | return OAuth1Session( |
| 65 | client_key=config.CONSUMER_KEY, |
| 66 | client_secret=config.CONSUMER_SECRET, |
| 67 | resource_owner_key=token, |
| 68 | resource_owner_secret=token_secret, |
| 69 | callback_uri=config.CALLBACK_URL |
| 70 | ) |
| 71 | }}} |
| 72 | |
| 73 | Next, we perform the OAuth login process. |
| 74 | |
| 75 | To do that, we first obtain an OAuth1 session by calling the above function, then we invoke `fetch_request_token()` to obtain the temporary tokens. We will need these temporary tokens to exchange for the actual access token necessary for the API accesses once we have been authorised. |
| 76 | |
| 77 | {{{ |
| 78 | oauth = get_oauth_session() |
| 79 | fetch_response = oauth.fetch_request_token(config.REQUEST_TOKEN_URL) |
| 80 | # Save the temporary tokens |
| 81 | oauth_token = fetch_response.get('oauth_token') |
| 82 | oauth_token_secret = fetch_response.get('oauth_token_secret') |
| 83 | }}} |
| 84 | |
| 85 | Now we have the temporary tokens with us, we will now obtain the authorisation from Telldus. |
| 86 | |
| 87 | We configure the OAuth1 session with the authorisation URL and redirect the browser to the authorisation URL `AUTHORIZE_URL`, which would call up the Telldus Live login page where you will be asked to provide your Telldus login ID and password for authentication and authorisation. |
| 88 | |
| 89 | {{{ |
| 90 | authorization_url = oauth.authorization_url(config.AUTHORIZE_URL) |
| 91 | redirect(authorization_url) |
| 92 | }}} |
| 93 | |
| 94 | Upon finishing the authorisation (whether it was successful or not), the browser will always be redirected to the `callback_uri` provided in the OAuth1 session. This callback_uri can also be defined in the `config.py` such as `CALLBACK_URL`. |
| 95 | |
| 96 | **Handling callback** |
| 97 | |
| 98 | Once the authorisation is done, and if it is successful, we could then use the temporary tokens to exchange for the access token. |
| 99 | |
| 100 | We can determine if the authorisation was successful or not by inspecting the oauth_verifier: |
| 101 | |
| 102 | {{{ |
| 103 | oauth = get_oauth_session(oauth_token, oauth_token_secret) |
| 104 | oauth_response = oauth.parse_authorization_response(request.url) |
| 105 | verifier = oauth_response.get('oauth_verifier') |
| 106 | if not verifier: |
| 107 | print('Authorization failed or was denied.') |
| 108 | }}} |
| 109 | |
| 110 | Now we can exchange for the access token by calling `fetch_access_token()`, and replace the temporary ones with these: |
| 111 | |
| 112 | {{{ |
| 113 | oauth_tokens = oauth.fetch_access_token(config.ACCESS_TOKEN_URL, verifier=verifier) |
| 114 | # Replace the temporary tokens with the final ones |
| 115 | oauth_token = oauth_tokens.get('oauth_token') |
| 116 | oauth_token_secret = oauth_tokens.get('oauth_token_secret') |
| 117 | }}} |
| 118 | |
| 119 | With these two, `oauth_token` and `oauth_token_secret`, we can now access to the Telldus API by calling the appropriate API endpoints. |
| 120 | |
| 121 | For example, to list all the devices under your account as JSON: |
| 122 | |
| 123 | First we construct the OAuth1 session by passing it our newly obtained tokens as well as the parameter values required for the `devices/list` API. Then we invoke the `get()` function to obtain the list of devices. The returned data will be in JSON: |
| 124 | |
| 125 | {{{ |
| 126 | oauth = get_oauth_session(access_token, access_token_secret) |
| 127 | params = { |
| 128 | 'supportedMethods': 'TURNON|TURNOFF', # Example parameter |
| 129 | 'format': 'json' |
| 130 | } |
| 131 | response = oauth.get("https://pa-api.telldus.com/json/devices/list", params=params) |
| 132 | devices = response.json().get('devices', []) |
| 133 | }}} |
| 134 | |