認証・認可周りのメモ
Okta(Auth0)のセミナーを受ける中で、そもそもの認証・認可の基本がわかっていなかったので、そこらへんを整理したメモ。
補足:他要素認証、二段階認証
多要素認証
K Knowledge … パスワード、PIN、生年月日、秘密の質問
P Prossession … 携帯、メール、コードジェネレーター
I Inherence … 指紋、顔、署名
他段階認証
K --> K のように複数段階で認証。ただしこの場合は「K」のみでの認証なので、異なる要素を組み合わせるべき
認証・認可
似てるけど別物
認証 (Authentication)
そいつが「誰か」を確認・識別するプロセス
例:ID/PWなどで認証をおこなうこと
認可 (Authorization)
認証後、ユーザーに対して権限を与えるプロセス
例: そいつに対して特定のデータを閲覧、編集、または削除する許可を持っているかどうかを判断すること
SAML/OAuth
それぞれ、認証・認可の代表的な仕組み
SAML
認証の代表的な仕組み。SSOの実現に使われる。
SP:アプリケーション本体
IdP:GoogleWorkSpaceやOktaなどのIDプロバイダーやADなど
OAuth
認可の代表的な仕組み。同じくSSOの実現に使われる。
認可することで、外部サービスからのデータ取得ができるようになったりする。
認可サーバー:Googleのアカウント連携許可画面など
リソースサーバー:GoogleカレンダーのAPIなど
比較
OAuthの実装例
簡単なデモコード
Oauthのサンプルコードをつくった。
from flask import Flask, redirect, request, session, url_for
from authlib.integrations.flask_client import OAuth
import os
app = Flask(__name__)
app.secret_key = os.urandom(24)
oauth = OAuth(app)
google = oauth.register(
name='google',
client_id='YOUR_GOOGLE_CLIENT_ID',
client_secret='YOUR_GOOGLE_CLIENT_SECRET',
access_token_url='https://accounts.google.com/o/oauth2/token',
access_token_params=None,
authorize_url='https://accounts.google.com/o/oauth2/auth',
authorize_params=None,
api_base_url='https://www.googleapis.com/oauth2/v1/',
client_kwargs={'scope': 'openid email profile'},
)
@app.route('/')
def index():
if 'user' in session:
return f'Logged in as {session["user"]["email"]}<br/>' \
f'<a href="/logout">Logout</a>'
return '<a href="/login">Login with Google</a>'
@app.route('/login')
def login():
redirect_uri = url_for('authorize', _external=True)
return google.authorize_redirect(redirect_uri)
@app.route('/authorize')
def authorize():
token = google.authorize_access_token()
resp = google.get('userinfo')
user_info = resp.json()
session['user'] = user_info
return redirect('/')
@app.route('/logout')
def logout():
session.pop('user', None)
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)
Googleを使った認証・認可。
login() にて、Googleによる認可用の画面にリダイレクトされる
(Googleへの認証はすでに済みの前提)ユーザーが承諾すると、Googleは認可用のトークンを付与して authorize() にリダイレクト
※ 「url_for('authorize', _external=True)」にて、認可時の遷移先があらかじめ指定されている
補足:セキュリティ対策
NIST Cyber Security Framework
Identify 識別
Detect 検知
Protect 防御
Respond 対応
Recover 復旧