--- title: App Authentication --- # App Authentication Tent uses [OAuth 2](http://tools.ietf.org/html/draft-ietf-oauth-v2-31) for app authentication. Because of the distributed nature of Tent, it is necessary for apps to register with the Tent entity before doing the authentication flow. After the authentication flow, requests are authenticated using the credentials with [MAC Access Authentication](http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01). ## App Registration Before authenticating a user, the application must be registered with the specified Tent entity. The first step is to perform discovery on the provided entity url. ```text HEAD / Host: titanous.com ``` ```text 200 OK Tent-Server: https://tent.titanous.com ``` The next step is to register the application with the server. Registration specifies some details about the app, as well as the exact `redirect_uris` that will be used during the OAuth flow. The response `id`, `secret`, and `mac_algorithm` are used to authenticate future requests to the Tent server. The `id` is used as the `client_id` in all OAuth requests. ```text POST /apps Content-Type: application/json Accept: application/json ``` ```json { "name": "FooApp", "description": "Does amazing foos with your data", "url": "http://foooo.com", "icon": "http://foooo.com/icon.png", "redirect_uris": ["http://fooapp.com/tent/callback"], "scopes": { "write_profile": "Uses an app profile section to describe foos", "read_followings": "Calculates foos based on your followings" } } ``` ```text 201 Created Content-Type: application/json Location: https://tent.titanous.com/apps/6737b ``` ```json { "id": "6737b", "secret": "3d2adf9a68bf64f4eaff70a7c7700a8", "mac_algorithm": "hmac-sha-256" } ``` ### Request Parameters
Name Required Type Description
name Required String The human name of the app to show the user
description Required String A short description of the application to show the user
url Required String The main url of the app
icon Optional String The url to an icon for the app
redirect_uris Optional Array A list of exact (including parameters) urls that will be used as OAuth redirect_uri.
scopes Optional Object A list of scope key to description value mappings of all scopes that the app might use. The descriptions should describe why the specific scope is necessary for the app to function.
### Response Parameters
Name Description
id The identifier of the app. This is used as the MAC key identifier for requests to/from the Tent server, as well as the client_id in the OAuth flow.
secret The secret used as the MAC key when modifying the registration and receiving notifications.
mac_algorithm The MAC algorithm to be used.
## App Registration Modification The request must be authenticated with a MAC generated using the secret from the initial registration. ### PATCH /apps/:id ```text PATCH /apps/aff70a7 Host: tent.titanous.com Content-Type: application/json Accept: application/json Authorization: MAC id="aff70a7", ts="1336363200", nonce="dj83hs9s", mac="bhCQXTVyfj5cmA9uKkPFx1zeOXM=" ``` ```json { "name": "FooApp", "description": "Does amazing foos with your data", "url": "http://foooo.com", "icon": "http://foooo.com/icon.png", "redirect_uris": ["http://fooapp.com/tent/callback"], "scopes": { "write_profile": "Uses an app profile section to describe foos", "read_followings": "Calculates foos based on your followings" } } ``` ## Authentication Flow ### Auth Request The app requests the user's Tent identifier, and performs discovery on it to find the Tent API root. The app then builds an auth request and redirects the user-agent to it: ```text /auth?client_id=6737b &redirect_uri=http://fooapp.com/tent/callback &scope=read_posts,read_profile &state=87351cc2f6737bfc8ba &tent_profile_info_types=https://tent.io/types/info/music &tent_post_types=https://tent.io/types/posts/status#0.2.0,https://tent.io/types/posts/photo#0.2.0 ``` #### Parameters
Name Required Description
client_id Required The id obtained by registering with the Tent server
redirect_uri Required The URI to redirect to after authentication is complete. It must exactly match a URI (including parameters) provided during app registration in redirect_uris.
state Optional This parameter will be added to the redirect_uri and should always be set to a random string that is stored in the session, and then verified to prevent cross-site request forgery attacks.
scope Optional A comma-separated list of scopes that the app is requesting access to.
tent_profile_info_types Optional A comma-separated list of profile_info_type_url#version profile info type specifiers that the app is requesting access to. Set to all to request full access to the profile.
tent_post_types Optional A comma-separated list of post_type_url#version type/version specifiers that the app is requesting access to. Set to all to request access to all posts.
#### Scopes
Scope Description
read_profile Read profile sections listed in the profile_info parameter
write_profile Read and write profile sections listed in the profile_info parameter
read_followers Read follower list
write_followers Read follower list and block followers
read_followings Read followings list
write_followings Read followings list and follow new entities
read_posts Read posts with types listed in the post_types parameter
write_posts Read and publish posts with types listed in the post_types parameter
### Redirect After the user has authorized the application, the Tent server will redirect the User-Agent back to the specified `redirect_uri` with a `code` that can be used to retrieve authentication details from the server. The `state` parameter should be matched against the `state` parameter sent in the initial request to prevent request forgery. ```text 302 Found Location: http://fooapp.com/tent/callback?code=27ec1c54980f1af74&state=87351cc2f6737bfc8ba ``` ### Access Token The `code` must be traded for permanent authentication details that can be used to access the Tent server on behalf of the user. #### POST /apps/:id/access\_token The request must be signed with a MAC using the secret obtained during app registration. Currently only the `mac` `token_type` is supported. ```text POST /apps/6737b/access_token Content-Type: application/json Accept: application/json Authorization: MAC id="6737b", ts="1336363200", nonce="dj83hs9s", mac="bhCQXTVyfj5cmA9uKkPFx1zeOXM=" ``` ```json { "code": "27ec1c54980f1af74", "token_type": "mac" } ``` The server will respond with the authentication details necessary to interact with the Tent server on behalf of the user. ```text 200 OK Content-Type: application/json ``` ```json { "access_token": "7b7df67598602", "mac_key": "18bcf2bae86948731", "mac_algorithm": "hmac-sha-256" "token_type": "mac", } ``` #### Response Parameters
Name Description
access_token Used as the MAC key identifier.
mac_key Used as the MAC key for requests.
mac_algorithm The MAC algorithm to be used.
token_type Specifies the token type. Currently always mac
## Request Authentication Tent uses [HTTP MAC Access Authentication](http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01) to authenticate app requests. Requests to modify the app's registration details must be authorized using the provided `id` and `secret` as the MAC key identifier and MAC key respectively. Requests to the Tent server on behalf of an authenticated user must be authorized using the credentials retrieved at the end of the auth flow. The `access_token` and `mac_key` are the MAC key identifier and MAC key respectively. Currently all Authorization headers in this documentation are fake, but they will be real examples when we have the example generator written.