Skip to content
ContentsSign-in codes by webhook

Sign-in codes by webhook

When a website asks one of your identities to verify, Joinpane can tell your own tools or a team chat as well as your phone. This is what we send and how to check it came from us.

Add a webhook

A webhook is yours, like your phone: it hears about the identities you're the phone owner for. In Joinpane, open Settings, then Your account, and under Sign-in codes choose Add URL.

  • A public https address. Joinpane doesn't send to private networks.
  • A signing secret, shown once. Your tool uses it to check each request. Changing the URL makes a new one.
  • At the same moment as the app's notification, once, with 5 seconds to answer. A code doesn't wait, so we don't retry. Your account shows how the last delivery went.
  • Never the code itself, nor a cookie, a password or an IP address. The code reaches the website only when a person types it.

What arrives

A POST with a JSON body. Any 2xx answer counts as delivered; we don't follow redirects.

Event types

Check it came from Joinpane

Joinpane-Signature holds when it was sent (t, in Unix seconds) and an HMAC-SHA256 of t, a full stop and the body, keyed with your signing secret (v1, in hex). Work it out from the body exactly as it arrived, before any JSON parsing, and compare in constant time.

Node.js

Python

Chat channels

Every delivery carries the whole message as one line in text, and again in content. So a channel's incoming webhook URL from Slack, Google Chat or Discord works as it is: paste it into Add URL and the channel shows the line, with the link to answer it. A chat channel ignores the signature.

Anyone in the channel sees which identity needs a code. Only people who can answer it in Joinpane can type one: the identity's phone owners and the people who can drive it.

Telegram

Where Joinpane offers it, Sign-in codes has a Connect button for Telegram. It opens a private chat with Joinpane's bot; press Start, and requests arrive there with a button into Joinpane. Reply to a request with the code and we type it into the website, as if you'd entered it in the app. Send /stop to disconnect.

More on phone owners and the order we reach people in is on the .