いろんな課題を解決するために、ICT やデータを活用して、良いサービスを提供する都市や地域
データを活用か……
最近情報漏洩とかも多いし、セキュリティって大事ですよね
なので、今回はみなさんも普段使っている認証と認可について話します (ごり押し)
まあ、実際どういう風にスマートシティに組み込むかはすごい人が考えてくれるでしょう!
【注意】OAuth2.0のimplicit grant flowを使って認証(Authentication)をしてはいけない
百聞は一見に如かず。見てみるのが早い。
今回は、Line MusicのOAuth2.0を例に見てみましょう
ユーザー : ログインをしようとしている人 (ぼく)
クライアント : ログインを受け付ける側のアプリケーション (Line Music)
認可サーバー : ユーザーの認可を受け付けるサーバー (Line)
scope=profileというのが最初のリクエストに含まれていましたが、これは何?
これは、アクセスする情報の範囲を指定するものです。
例) 個のアプリに口座番号を連携したいが、口座残高までは連携したくない
これによりアクセス範囲を限定するアクセス制御が可能になります。
また、同意画面でどのような情報を取得するかをユーザーに確認させることができます。最終的にどのスコープのAccess Tokenになったかというのは、TokenエンドポイントにAccess Tokenを取りに行った時点で確認できます。
Lineの場合はprofile openid emailの3つが指定できます。
複数指定する場合はスペース区切り(%20)で指定します。
例えば、profileだとユーザーのプロフィール情報を取得できるようになります。
Google Driveだと、https://www.googleapis.com/auth/drive.fileなどを指定することで情報を取得することができます。
これは元のProviderによって異なるのでドキュメント要参照です。
code_challenge=aaa&code_challenge_method=S256 は何なのでしょうか?
PKCE(pronounced "pixy")とは、「Proof Key for Code Exchange by OAuth Public Clients」の略称で、認可コード横取り攻撃を対策するための、OAuth2.0の拡張仕様です。
認可コード(code)を取得する際に、code_verifierを生成し、code_challengeに変換したものをリクエストに含めることで、認可コード横取り攻撃を防ぎます。
import (
"crypto/sha256"
"encoding/base64"
)
var code_vertifier = "XXXX" // ランダムに生成する
var hash = sha256.Sum256([]byte(code_vertifier))
var code_challenge = base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(hash[:])
sha256でハッシュ化したもの(code_challenge)を先に送り、Access Token取得時に元(code_vertifier)も一緒に送らないとTokenを取得できないので、攻撃者が現実時間で元のcode_vertifierを算出するのは困難になります。
Access Tokenは有効期限(大体3600秒)がありますが、Refresh Tokenを使うことでAccess Tokenを再取得できます。scopeにofflineを指定すればOK
{
"access_token": "新しいAccess Token",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "新しいRefresh Token",
"scope": "指定されたScope"
}
ユーザーがアプリを使っていない間でも何かしらの処理をしたい場合につける
先ほど、ログインするために飛ばすリンクがあったりリクエストを送ればTokenやユーザー情報が取れるという話でしたが、どこにおくればいいんでしょうか?
ClientIDとSecret, Redirect URIまで指定しているのに、3つもリンクを設定しないといけないのでしょうか?
そのOpenIDプロバイダーの発行者識別子(issuer)に /.well-known/openid-configuration を付けた URL に HTTP GET リクエストを投げることで、当該 OpenID プロバイダーの情報を取得することができます。
例1: https://accounts.google.com/.well-known/openid-configuration
例2: https://access.line.me/.well-known/openid-configuration
{
"issuer": "https://access.line.me",
"authorization_endpoint": "https://access.line.me/oauth2/v2.1/authorize",
"token_endpoint": "https://api.line.me/oauth2/v2.1/token",
"revocation_endpoint": "https://api.line.me/oauth2/v2.1/revoke",
"userinfo_endpoint": "https://api.line.me/oauth2/v2.1/userinfo",
"scopes_supported": ["openid", "profile", "email"],
"jwks_uri": "https://api.line.me/oauth2/v2.1/certs",
"response_types_supported": ["code"],
"subject_types_supported": ["pairwise"],
"id_token_signing_alg_values_supported": ["ES256"],
"code_challenge_methods_supported": ["S256"]
}
Microsoft identity platform and OAuth 2.0 authorization code flowより引用
Microsoft identity platform and OAuth 2.0 client credentials flowより引用
ご清聴ありがとうございました