R Shiny に認証機能をつける

R Shiny の Tips として、アプリに認証機能をつける方法を紹介します。

なお、この方法はセキュリティ面で言えばクソ雑魚の部類なので、攻撃を想定しない世界線でのみご活用ください。

認証機能の付け方

お好きなアプリを作ったら、

  1. ui.R で書いた UI 情報を書いたオブジェクトを secure_app() に代入
  2. 認証情報を ui.R か server.R のどっちでもいいので記述し、server.R の shinyServer 内の関数の中に check_credentials() を追加

で終わりです、その部分だけコードを抜き出すと以下のようになります。

ui = fluidPage(レイアウトの構成情報)
ui_secure = secure_app(ui)
# 認証情報をハードコーディング
credentials <- data.frame(
  user = c("everyday-S", "everyday-K"),
  password = c("neko-pasta", "inu-udon")
)

# サーバー側での処理
shinyServer(function(input, output) {
  # この部分で認証機能を追加
  result_auth <- secure_server(
    check_credentials = check_credentials(credentials), # 認証情報
    timeout = 0 # タイムアウトを無効化
    )
})

この例だとユーザーを2つ登録し、それぞれ別々でパスワードを設定しています。

これでアプリを立ち上げると、次のような画面が最初に出ます。

server.R に書いた通り Username と Password を入力すれば、アプリを使えるようになります。

この例のセキュリティ上ダメなところ

まず、パスワードとユーザ名をハードコーディングしてしまってます。これがもし秘匿情報を扱ったもので、このコードが何らかの形で第三者に見られる可能性があると思うと震えが止まりません。

また、http で任意のアドレスからのアクセスを許した場合、url がバレる→パスワード総当たり攻撃みたいな感じで容易に破られる可能性があります。

この辺をしっかりやりたいなら、サーバの設定でインバウンドルールを制限したりするのがいいと思います。

RR,Shiny,アプリ

Posted by S