... use Omniport OAuth2? ======================== The following walkthrough will show you how to integrate Omniport OAuth2 in your applications. Registering your application ---------------------------- Register your app for Omniport OAuth2 by visiting the developer portal on ``/developer/add``. Here you will be asked a few details about your app. You have to - add your app name, redirect URIs in correct format. - describe your app in strictly 127 - 511 words. - select the minimum number of scopes (user information) that you will require for your app. - read :doc:`Omniport developer terms of use <../legal/developer_terms_of_use/>` and agree to all of the terms therein. Click on Add button to proceed. You will be taken to app administration dashboard. Here you can edit a few things about your app, like branding, team members and redirect URIs. Note down your **client ID** and **client secret key** from the dashboard. .. note:: Describe your app adequately and truthfuly. Also keep in mind that selecting as fewer scopes as possible will increase the odds in favour of approval of your app by the administration. After submitting your app request, your approval status can be seen and tracked from the developer dashboard. .. warning:: You will be unable to use OAuth2 without said approval. Users will not be able to access your authorise your app to use their data. Authorising the user -------------------- To authorise your users, redirect them to ``/oauth/authorise`` through a ``GET`` request with the following parameters. ========================= ===================================================================== Parameter Description ========================= ===================================================================== **client_id** (required) The client ID you obtained from the dashboard **redirect_uri** One of the redirect URIs you have registered on the dashboard **state** Any string that you want the ``REDIRECT_URI`` to receive on success ========================= ===================================================================== .. warning:: If the ``redirect_uri`` does not match any of the listed redirect URIs, the authorisation request will fail and the user will not see an authorisation screen. .. note:: For additional information on the query parameters refer to the `documentation `_ of the Django OAuth Toolkit PyPI package. A sample authorisation request URL could therefore look like the one below. :: /oauth/authorise/?client_id=MY_CLIENT_ID <&redirect_uri=REDIRECT_URI> <&state=RANDOM_STATE_STRING> The user experience ------------------- At this point, you’ve forwarded the user to Omniport authorisation page, where they will be greeted by the following screen (they might need to log in before they see it). .. image:: /_static/gif/oauth.gif :target: / :align: center :alt: OAuth authorisation screen Neither you or your application can or need to do anything here; Omniport deals with the user, receiving the user's intent to approve or disapprove your app. Based on whether the user approves the app or denies it, the user will be redirected to ``REDIRECT_URI`` or back to Omniport home. Handling the Response from Omniport OAuth2 ------------------------------------------ If the user clicks approves the app to access their data on the previous screen, OAuth2 will redirect the user to the ``REDIRECT_URI`` specified earlier with a code parameter, any state passed to the authorisation URL will be forwarded to ``REDIRECT_URI``. :: REDIRECT_URI?code=AUTHORISATION_CODE <&state=RANDOM_STATE_STRING> This one-time authorisation code has a TTL of 1 minute. So the next step, which is anyways supposed to be automatic must be done pretty fast. Getting the access and refresh token ------------------------------------ Once your application has an authorization code, it will now need to exchange the authorization code for a pair of access and refresh tokens from Omniport. To get these tokens, you’ll need to make a ``POST`` request to ``/open_auth/token/`` with the following parameters: ============================= =============================================================== Parameter Description ============================= =============================================================== **client_id** (required) The client ID you obtained from the dashboard **client_secret** (required) The client secret you obtained from the dashboard **grant_type** (required) ``authorization_code`` as it is **redirect_uri** (required) One of the redirect URIs you have registered on the dashboard **code** (required) The authorisation code sent to the REDIRECT_URI ============================= =============================================================== If everything goes right and the request is successful, you’ll receive a 200 response containing a ``JSON`` body like this: .. code-block:: json { "access_token": "vqygrcouTuyAYHZLz3rGcZf5FpPd3K", "expires_in": 36000, "token_type": "Bearer", "scope": "read write", "refresh_token": "BbVJsFL1Ks5LkXDe9ZFUIFvIzXKt9M" } However, if the response is not successful, you’ll receive an error response. .. code-block:: json { "error": "some_error_message" } Using the access token ---------------------- Now that you have the access token, you can get the user data by sending a ``GET`` request to ``/open_auth/get_user_data/`` with the access token in the header as follows: .. code-block:: json { "Authorization": "Bearer vqygrcouTuyAYHZLz3rGcZf5FpPd3K" } where ``vqygrcouTuyAYHZLz3rGcZf5FpPd3K`` is the access token. If the access token is valid, then you will receive a 200 response with a dictionary containing the user's information based on the scopes of the client app, similar to this: .. code-block:: json { "userId": 1234, "username": "15xxx009", "person": { "shortName": "dhruvkb", "fullName": "Dhruv Kanti Bhanushali", "roles": [ { "role": "Student", "activeStatus": "ActiveStatus.IS_ACTIVE" }, { "role": "Maintainer", "activeStatus": "ActiveStatus.IS_ACTIVE" } ], ... }, "student": { "enrolmentNumber": "15xxx009", ... }, "contactInformation": { "instituteWebmailAddress": "xyz@iitr.ac.in" ... } } However, if the access token is invalid, you will receive the following ``401 Unauthorized`` error response. .. code-block:: { "detail": "Authentication credentials were not provided." } Generating new access token using refresh token ------------------------------------ The access token has a short lifetime of **36000 seconds**. If it expires, you'll need to generate new tokens either by re-authenticating the user or using the refresh token. To generate these new tokens, you’ll need to make a ``POST`` request to ``/open_auth/token/`` with the following parameters: ============================= =============================================================== Parameter Description ============================= =============================================================== **client_id** (required) The client ID you obtained from the dashboard **client_secret** (required) The client secret you obtained from the dashboard **grant_type** (required) ``refresh_token`` as it is **refresh_token** (required) The refresh token received in exchange of authorization code. ============================= =============================================================== The newly created tokens were successfully generated if you get a 200 response. The "JSON" response body will appear as follows: .. code-block:: json { "access_token": "cjlgnpwhfuyAYHZLz3rGcZf5FpPd3K", "expires_in": 36000, "token_type": "Bearer", "scope": "read write", "refresh_token": "NhdwsFL1Ks5LkXDe9ZFUIFvIzXKt9M" } You will get an error response, though, if the response is unsuccessful. .. code-block:: json { "error": "some_error_message" } Logging out the user ------------------------------------ You can revoke the tokens to bar access when the user logs out. To revoke the access and refresh token, you’ll need to make a ``POST`` request to ``/open_auth/revoke_token/`` with the following parameters: ============================== =============================================================== Parameter Description ============================== =============================================================== **client_id** (required) The client ID you obtained from the dashboard **client_secret** (required) The client secret you obtained from the dashboard **token** (required) The access/refresh token you wish to revoke **token_type_hint** (required) ``access_token`` or ``refresh_token`` ============================== =============================================================== Future plans ------------ As of now the OAuth2 flow supports only the ``authorisation_code`` grant type in the flow. This will eventually be expanded to support most if not all of the multitude of flows backed by the OAuth2 specification. Further reading --------------- You should read the `official OAuth docs `_ for more theoretical information on OAuth2 and its many loosely-regulated forms. For additional information on the parameters refer to the `documentation `_ of the Django OAuth Toolkit PyPI package.