見出し画像

認証・認可周りのメモ


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 復旧



いいなと思ったら応援しよう!