NFCタグ で鍵を開けよう(2) iPhoneを鍵とし、ドアにNFCタグを設置するパターン

2019年4月1日 所 友太 / @tokorom

image

この記事は「NFCタグ で鍵を開けよう」シリーズの第2弾です。 このシリーズは以下5つの記事に分けられて投稿予定です。

  1. NFCタグにURIを書き込む
  2. iPhoneを鍵とし、ドアにNFCタグを設置するパターン(この記事)
  3. iOSアプリを経由してセキュリティレベルをあげる
  4. NFCタグを鍵とし、ドアにNFCリーダーを設置するパターン(まだ書いてないけど気が向いたら書くかも)
  5. より実用的にしていくために
  6. iOS13時代の最終形

この記事でやること

前回は、NFCタグにhttps://tag.exsample.com/lockというURIを書き込むことに成功し、それをiPhone XR/XSで読み込めることを確認しました。

今回は、このURIで動作するAPIをAWS Lambda1などで作成し、そこからSesame APIを叩いて鍵のアンロックを実現します。

それさえできれば、NFCタグを自宅のドアなどに貼っておけば、iPhoneをそのNFCタグにタッチして鍵をロック/アンロックできるようになるはずです。

この記事は実験レベルでセキュリティを考慮していません。例えばこの記事で作ったURLを誰かに知られてしまうと、誰でも鍵を開けることができてしまうため、絶対にこのまま実用しないでください!

Sesame APIの利用

APIキーの取得

Sesame APIを叩くうえで必要なAPIキーやSesame ID(device_id)の取得方法についてはCANDY HOUSEのオフィシャルブログ

https://ameblo.jp/candyhouse-inc/entry-12416936959.html

をご参照ください。

API仕様

Sesame APIの仕様については https://docs.candyhouse.co/ にきちんとしたドキュメントがあります。

curlで叩いてみる

curl -H "Authorization: YOUR_AUTH_TOKEN" \
  https://api.candyhouse.co/public/sesames

で、管理しているデバイスのリストが取得できます。 YOUR_AUTH_TOKENはAPIキーに置き換えてください。

[{"device_id": "aaaaaaaa-aaaa-aaaa-1111-111111111111", "serial": "ABCDEFG", "nickname": "\u30c9\u30a2"}]

鍵をロック

上で取得したdevice_idを利用し、

curl -H "Authorization: YOUR_AUTH_TOKEN" \
  -H "Content-Type: application/json" \
  -X POST -d '{"command":"lock"}' \
  https://api.candyhouse.co/public/sesame/YOUR_DEVICE_ID

とするだけです。

鍵をアンロック

同じく、

curl -H "Authorization: YOUR_AUTH_TOKEN" \
  -H "Content-Type: application/json" \
  -X POST -d '{"command":"unlock"}' \
  https://api.candyhouse.co/public/sesame/YOUR_DEVICE_ID

でアンロックもできます。

AWS Lambdaでの実装

※この記事ではAWS Lambdaの使い方については説明しません

それではこのSesame APIをAWS Lambda上で実行すよう実装してみましょう。

以下、Node.jsでの実装サンプルです。 長々書いていますが、やっているのは上で紹介したアンロックAPIを叩くことだけです。

exports.handler = (event, context, callback) => {
  console.log('start')

  main(callback)
}

async function main(callback) {
  const response = await requestUnlock()

  callbackResponse(200, response, callback)

  return true
}

const url = require('url')
const fetch = require('node-fetch')

function callbackResponse(statusCode, message, callback) {
  let response = {
    "statusCode": statusCode,
    "body": JSON.stringify(message)
  }
  callback(null, response)
}

async function requestUnlock() {
  try {
    const urlObject = {
      protocol: 'https',
      hostname: 'api.candyhouse.co',
      pathname: '/public/sesame/YOUR_DEVICE_ID'
    }
    const headers = {
      'Content-Type': 'application/json',
      'Authorization': 'YOUR_AUTH_TOKEN'
    }
    const request = url.format(urlObject)

    const params = {
      command: 'unlock'
    }
    const body = JSON.stringify(params)

    console.log('request to ' + request)
    console.log('body: ' + body)

    const response = await fetch(request, {method: 'POST', headers: headers, body: body})
    const json = await response.json()
    return json
  } catch (error) {
    console.log(error)
  }
}

まとめ

あとは実装したものをAWS Lambdaにデプロイし、NFCタグに書き込んだURIでこのLambdaが動作するようにするだけです。

これで、iPhoneを鍵代わりにし、NFCタグをタッチして鍵をアンロックする仕組みができました。

くどいようですが、

この記事は実験レベルでセキュリティを考慮していません。例えばこの記事で作ったURLを誰かに知られてしまうと、誰でも鍵を開けることができてしまうため、絶対にこのまま実用しないでください!

こちらは絶対に守ってください。

記事一覧

  1. NFCタグにURIを書き込む
  2. iPhoneを鍵とし、ドアにNFCタグを設置するパターン(この記事)
  3. iOSアプリを経由してセキュリティレベルをあげる
  4. NFCタグを鍵とし、ドアにNFCリーダーを設置するパターン(まだ書いてないけど気が向いたら書くかも)
  5. より実用的にしていくために
  6. iOS13時代の最終形

  1. AWS LambdaでなくともこのURIで実行されるプログラムを書ければ別のものでかまいません ↩︎

Related Entries
Latest Entries
すべての記事一覧をみる