認可とは、クライアントがリソースオーナーの協力で、認可サーバーに対して一連の動作を実行した後に、クライアントが認可済の状態になるということを指します。現実では主にアクセストークンを持っているか否かでクライアントの認可状況を判断します。
OAuth2 の専門用語と説明
専門用語 | 説明 |
---|---|
リソースオーナー | セゾン会員、もしくはクライアントのユーザ。 |
ブラウザー | リソースオーナーが使っているウェブブラウザー |
クライアント | セゾンコネクトを利用するアプリケーションとウェブサービス。 |
認可サーバー | アクセスとリフレッシュトークンの払い出しと認証機能を担うサーバー。 |
リソースサーバー | ユーザの情報を保有するサーバー。 |
認可フロー
認可フローについて、セゾンコネクトが実装しているのが ietf が定義した Authorization Code Grant Flow であるため、以下の説明は ietf の定義に従い作成されております。
詳細はしたの図のように、成功すれば最後にアクセストークンを入手できます。
① | リソースオーナーがクライアントのウエブサイトにアクセス |
② | クライアントが自分の client_id つけて、ブラウザーを認可サーバーにあるセゾンコネクトのログインページにリダイレクトさせる |
③ | リソースオーナーがセゾンコネクトのログインページでIDとパスワードを入力し登録 |
④ | 認可サーバーが Authorization Code を url につけ、ブラウザーをクライアントにリダイレクトさせる |
⑤ | ブラウザーが Authorization Code をつけてクライアントのウェブサイトにアクセス |
⑥ | クライアントが url につけた Authorization Code を自分のclient_secret と加えて、認可サーバーにアクセストークンをリクエスト |
⑦ | 認可サーバーがクライアントに access_token と refresh_token を払い出す |
アクセスフロー
セゾンコネクトがメッセージ認証コード(MAC)に通じてトークンを認証しているため、以下の説明は ietf の定義に従い、作成されております。
アクセストークンを入手した後、アクセストークンとクライアントシークレットや他に必要情報加えれて特定の header を作成できれば、それでリソースサーバーにアクセスができます。
中でリクエストの中身と説明は以下の図のように(サンプルは会員属性情報照会の場合です)
mac の生成方法について
mac を生成するには timestamp
nonce
endpoint
domain_name
で生成した文字列と暗号化キー client_secret
が必要になります。
文字列の生成フォーマットは以下のように
[timestamp]\n[nonce]\nPOST\n[endpoint]\n[api_domain]\n443\n\n
// 中の POST と 443 の部分について、セゾンコネクトを利用する場合には固定値になります。
作成した文字列をメッセージにして、キーは client_secret
に設定し、HMAC(SHA-256)の方式で暗号化します。その暗号化された値をBase64に変換すれば mac に該当します。
必要情報の説明
アクセス認可に必要な情報についての説明は以下のように
timestamp | クライアント側の現在日時(1970年1月1日 00:00:00 GMTからの経過秒数) |
nonce | クライアントが生成した半角英数字十桁の乱数 |
endpoint | アクセス先の endpoint。例えば会員属性照会の場合は /auth/account/profile。 |
port | セゾンコネクトがhttpsのみ対応しているため、443に限定。 |
access_token | 認可フローを実行して認可済にされると入手できるアクセストークン。 |
client_secret | クライアントがセゾンコネクトに登録したときに、こちらから払い出した文字列。 |
api_domain | アクセス先のドメインネーム。例えば - api.saisoncard.co.jp (本番環境) - apit.saisoncard.co.jp (テスト環境) |
プログラム実装上の注意事項
認証レベル
アクセストークンの認可状態にはレベル 1 とレベル 2 二種の状態があります。
IDとパスワードで取れた認可はすべてレベル 1 になりますので、レベルアップするには二要素認証が必要です。実際のフローはどうぞ二要素認証の説明ページをご覧ください。
なお、レベル 2 に比べて、レベル 1 はほぼすべての更新系と決済系が利用できないので、どうぞ各 API の説明ページにご確認ください。
クライアント情報管理
上記の client_secret はクライアントを認証できる情報なので、必ず厳重にサーバーで保持するとお願い致します。