Authenticate from a Non-Trusted Device


There are 2 steps in authenticating a Non-Trusted Device

  1. Make a request from the Non-Trusted Device and wait for approval. The SDK will automatically show a prompt asking the user to approve this request from the Trusted Device.

  2. Approve the request from a Trusted Device. The user should tap a button to check if there's a login request. They can then approve or reject the login request.

  3. When the login request is approved, the Non-Trusted Device will receive oauth_tokens . You should validate these tokens in your backend.

Step 1: Make an Authentication Request

Same as how it works with Authenticating from a Trusted Device, to authenticate a device, call cotter.signInWithDevice . This will automatically detect whether the current device is a Trusted Device or not.

// 1️⃣ Request trusted device authentication
var cotter = new Cotter(API_KEY_ID);
  identifier,  // User's email, phone or username

When an Authentication Event is requested using method TRUSTED_DEVICE, there are 2 possible cases:

Case 1: The current device is a Trusted Device

You will be automatically approved if the request is coming from a Trusted Device. This is covered in Authenticate from a Trusted Device.

Case 2: The current device is NOT a Trusted Device

If the current device is not a Trusted Device, then it will create a pending event. This pending event will need to be approved by a Trusted Device.

Step 2: How to approve a pending request from a Trusted Device

To check if there's a pending event for this user, you can call the getNewEvent method from a Trusted Device.

approveLogin = async () => {
    let cotter = new Cotter(API_KEY_ID);
    try {
      let user = await cotter.getLoggedInUser();
      await user.checkNewSignInRequest();
    } catch (err) {

  title="Approve Login"

In the future, your app that is installed in a Trusted Device will receive a notification and this method is invoked when the notification is opened.

For now, you should tell your user to press a button and invoke this method when they try to login from a non-trusted device.

The SDK will open a prompt in the Trusted Device asking if the user want to approve or reject the authentication request

In the prompt in the user's Non-Trusted Device (right picture), you can Customize the Prompt to ask them to press a specific button in the Trusted Device to invoke the prompt on the left.

Step 3: Get the access token and validate it in your back end

When the user approved the login request in the Trusted Device, your onSuccess function in the authentication request in step 1 will be invoked and will receive a JSON response with an access token:

  // OAuth 2.0 Tokens
  "oauth_token": { 
    "access_token": "eyJhbGciOiJFUzI1N...",
    "auth_method": "TRUSTED_DEVICE",
    "expires_in": 3600,
    "id_token": "eyJhbGciOiJFUzI...",
    "refresh_token": "33625:anGsIfvFd...",
    "token_type": "Bearer"
  // Information about the login request
  "ID": 2535926,
  "CreatedAt": "2020-08-01T01:36:24.321921222Z",
  "DeletedAt": "0001-01-01T00:00:00Z",
  "UpdatedAt": "2020-08-01T01:36:24.321921425Z",
  "approved": true, // This login request is approved
  "client_user_id": "abcdefgh-d15c-466f-aaa3-f029a8e534c3",
  "event": "LOGIN",
  "ip": "",
  "issuer": "<YOUR API KEY ID>",
  "location": "San Francisco",
  "method": "TRUSTED_DEVICE",
  "new": false,
  "signature": "L6x8sLHyPTOMCxudw34YTFGCEO4dGvakJl0g9dIDjUp2gaXbD7Yfxo86Dr7OEtHYmSYegSJkwmZjMzDnPvltDQ==",
  "timestamp": "1596245784",
  "user_id": "00000000-0000-0000-0000-000000000000"

You should pass the access_token to your backend when logging-in users, approving transactions, etc. Learn how to validate the access token:

pageVerifying JWT Tokens

Last updated