An introduction to room access control with the Daily.co API

Using meeting tokens to manage room access

Overview

One of our most popular customer requests is how to do access control via [our API](https://docs.daily.co/reference). We’ll leverage the `/meeting-tokens` endpoints to accomplish this.

Consider the following use case for an online school with the following types of users:

- Administrator - needs admin access to all rooms. They may drop in as needed and make announcements and have control over the various features of the room.
- Teacher - same needs as an administrator but local to their own room.
- Student - needs to be able to join their room to attend classes.

Getting Started

First things first, make sure you have signed up for a [Daily.co account](https://dashboard.daily.co/) and that you have an API key (see your [Developers tab](https://dashboard.daily.co/)).

From there you can use your API key directly on the docs page to execute API calls (see [Using these docs](https://docs.daily.co/reference#using-these-docs)), or you can use the terminal utility of your choice and execute them via [curl](https://curl.haxx.se/).

A room of your own

Our ultimate goal is to facilitate a video call and that all starts with a room, so let’s create one. As a means of demonstrating our access control features, we’re going to create a room with the following non-default properties:

- "privacy": "private" - since tokens are one of the ways of accessing private rooms
- "owner_only_broadcast": true - this means only owners can turn on camera, mic, and share their screen

This will create a private room where only owners can broadcast.

Run the following `curl` command to create the room:

    -- CODE language-bash --
    curl --request POST \
    --url https://api.daily.co/v1/rooms \
    --header 'authorization: Bearer INSERT_YOUR_TOKEN_HERE' \
    --header 'content-type: application/json' \
    --data '{"properties":{"owner_only_broadcast":true},"name":"test-room","privacy":"private"}'


If your request was successful, you should get a response like this:

    -- CODE language-json --
    {"id":"3e1c696b-3dfa-4b20-8d13-153eb25a5bce","name":"test-room","api_created":true,"privacy":"private","url":"https://dailyphil.daily.co/test-room","created_at":"2020-05-12T22:56:22.309Z","config":{"owner_only_broadcast":true}}


Token access

Now let’s consider our tokens in terms of the roles we want to use them for.

Our administrator needs access to every meeting so we will create a token for them with the following properties:

- “is_owner”: true
- “user_name”: “Administrator”

> Note the omission of room_name. This will give the user associated with this token access to every meeting on your domain. While we highly recommend that you instead grant specific tokens for each room, we wanted to use this as a demonstration of this domain level access.

Run the following `curl` command to create the token:

    -- CODE language-bash --
    curl --request POST \
    --url https://api.daily.co/v1/meeting-tokens \
    --header 'authorization: Bearer INSERT_YOUR_TOKEN_HERE' \
    --header 'content-type: application/json' \
    --data '{"properties":{"is_owner":true,"user_name":"Administrator"}}'

If your request was successful, you should get a response like this:

    -- CODE language-json --
    {"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvIjp0cnVlLCJ1IjoiQWRtaW5pc3RyYXRvciIsImQiOiI4Y2I3MzhlMS02YTk1LTQ3ZjEtYTUxNy0wYTE5Y2YzMjhhNzkiLCJpYXQiOjE1ODkzMjU2MzZ9.SNC-UGVRlItIGpw-ufKgGsYRxA0d9MSuUqezNiiY9oQ"}


Now we’ll create a similar token for our teacher but we’ll include a `room_name` to scope it to their particular classroom. In this case the properties are: 

- “is_owner”: true
- “user_name”: “Teacher”
- "room_name": "test-room"


    -- CODE language-bash --
    curl --request POST \
    --url https://api.daily.co/v1/meeting-tokens \
    --header 'authorization: Bearer INSERT_YOUR_TOKEN_HERE' \
    --header 'content-type: application/json' \
    --data '{"properties":{"is_owner":true,"user_name":"Teacher","room_name":"test-room"}}'

Success:

    -- CODE language-json --
    {"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvIjp0cnVlLCJ1IjoiVGVhY2hlciIsInIiOiJ0ZXN0LXJvb20iLCJkIjoiOGNiNzM4ZTEtNmE5NS00N2YxLWE1MTctMGExOWNmMzI4YTc5IiwiaWF0IjoxNTg5MzI1OTU1fQ.pm1tIWuqJffnk1XjnivwEXz8Z6cillqTb2Sfrnprq1I"}


And finally we'll create a student token, with the following properties: 

- “user_name”: “Student”
- "room_name": "test-room"


    -- CODE language-bash --
    curl --request POST \
   --url https://api.daily.co/v1/meeting-tokens \
    --header 'authorization: Bearer INSERT_YOUR_TOKEN_HERE' \
    --header 'content-type: application/json' \
    --data '{"properties":{"user_name":"Student","room_name":"test-room"}}'


Success:

    -- CODE language-json --
    {"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1IjoiU3R1ZGVudCIsInIiOiJ0ZXN0LXJvb20iLCJkIjoiOGNiNzM4ZTEtNmE5NS00N2YxLWE1MTctMGExOWNmMzI4YTc5IiwiaWF0IjoxNTg5MzI2MDk0fQ.fp2N5MvukcCl4ZgRsv0gq4_L0OxpbigLQiLe3u-iIx4"}

Time for a test

The easiest way to test our various tokens is to add the `t=INSERT_TOKEN` query parameter to your meeting link.

The meeting link will look like this:

`https://dailyphil.daily.co/test-room?t=INSERT_TOKEN_HERE`

Functionally speaking, the administrator and teacher links should work identically. The student link will be different. Because we turned on `owner_only_broadcast`, the student link will have camera and microphone turned off and no option to turn them on.

Summary

You should now understand the basics of creating tokens with different access controls. For a full picture of meeting management for rooms and tokens, combine what your learned today with our post on [time limits](https://www.daily.co/blog/video-call-api-tutorial-time-limits-for-rooms-and-meetings).

Recent posts