ログイン機能、認証、認可、外部認証
現在絶賛ER図作成に苦戦しております。スバルです。エンティティの洗い出しをしている最中です。認証機能のあるAuthorizeテーブルを作るかどうか迷っています。
外部認証機能、いわゆるSNSログインに使う機能なのですが、初めてみる機能だったので、認証と認可、及び外部認証に関して学習してみました。
認可と認証
認可
「認可」は英語では Authorization と言う。略して AuthZ(AuthRと書く場合もあるらしい)と表すそう。意味としては とある特定の条件に対して、リソースアクセスの権限を与えること を表している。この、リソースアクセスの権限(アクセストークン)を発行するサーバのことを認可サーバと言う。
「鍵の発行」や「チケット(切符)の発行」を思い浮かべると分かりやすいとのこと。前者は部屋に入るための権限を、鍵与えることによって委譲している。後者は、入場するための権限を、チケットを与えることによって委譲している。認可はgive。チケット売り場のお姉さんが認可をする。
使用例
・Basic認証(ID/Password)
・生体認証 等
認証
「認証」は英語では Authentication と言う。略して AuthN と書いたりすることもあるそう。通信の相手が誰(何)であるかを確認することを指し示す。
「証明書の確認」を考えると理解しやすい。市役所で移転手続きをしたり銀行の窓口で口座開設をする時に、ご本人確認のために写真付きの本人確認証を提示くださいと言われるアレである。
しかしながら、認証とはその人が誰なのかを単純に確認する手順なだけ。認証をすることで正しい認可ができるのである。
使用例
- OAuth2.0
- APIKey などなど
外部認証
- 外部認証とは、外部で登録しているアカウントでログインの認証を行うことを指す。
よくSNSログイン機能を実装する時に使われる概念。そして、外部認証を実装する時に使われるものが、OAuthとOmniAuth。
これらは親子のような関係にあると認識している。
OmniAuth
OmniAuth は、ストラテジーと呼ばれる仕組みを提供し、認証プロバイダを介したユーザ認証方法を標準化しています。どんな認証プロバイダを使う時でも、そのプロバイダに対応する Omniauth のストラテジーが用意されていれば、大体同じようなインターフェースを介してユーザ認証ができる。
OmniAuthの用意する認証環境を使うことで、facebookやgoogleの外部認証を使うことができると言うことかな?
OAuth
OpenIdと似ている。
調べたところ、OpenIdとは、Webサービスの増加に伴い、マッシュアップ(複数のWebサービスを連動させて新しいサービスを作ること)が行われるようになってきたことで、ユーザーが複数のサービスに別々にユーザー登録をするわずらわしさを防ぐための仕組みを指しているそう。
OAuthでは、認証を与えたサービスの保持しているユーザーリソースを、認証を与えられたサービスが利用することができる。
Sorcery
railsのgem。ログイン認証機能を実装する為のGem。
require_login,logput,remember_me,redirect_back_or_toなど、ログイン周りの機能を提供してくれるgem。Deviceとよく比較される。
Sorceryの方が内部で使われているメソッドの理解がしやすいため、初心者がログイン機能を理解する上では、まずSorceryを使った方がいいと言う声が多い。
結論
通常のログイン画面を実装する場合はsorcery,TwitterやGoogleを使ってログインできるようにする場合は各種対応するOmniAuthのgemを使用することにした。
色々調べたけど全然頭に入ってない気がしてならない。実際にrails newをして、本格的にログイン機能を実装する段階に入ったら再度考えることにする。
RailsでFacebookとGoogleのOAuth連携。SNS認証の方法 - Qiita
「認証と認可」について調べたので、違いをざっくり整理した - Qiita
https://note.com/artefactnote/n/ne0089a217489
https://qiita.com/aiandrox/items/5435c8b285c7dc0c455f
GitHub - Sorcery/sorcery: Magical Authentication
OmniAuth OAuth2 を使って OAuth2 のストラテジーを作るときに知っていると幸せになれるかもしれないこと - Qiita