LoginSignup
1
0

More than 5 years have passed since last update.

Self-Issued OP 確認してみた @ Recruit ポンパレ

Last updated at Posted at 2018-04-24

Self-Issued OP 確認してみた @ Recruit ポンパレ

先日、2018/3/23金に開催された、OpenID Technight #15に参加した際、そこで紹介のあった OpenID Connect Self-issued OP について、下記にメモ書きしていたのですが、

OpenID Connect Self-issued OP概要 ~OpenID Technight #15より~
https://qiita.com/SAM-l/items/93b56c6061cfbb6653ec

その際「iPhoneのポンパレモールアプリで実際に動いている様子を見れるってよ」
ということだったので、実際にポンパレモールでやりとりされている電文を覗いてみました:grinning::grinning:

以下、覗いた結果です。

環境情報

  • 端末

    • iOS 11.3
    • ポンパレモールアプリ 2.1.7
  • 電文の確認に使ったもの

    • Mac OS High Sierra 10.13.4
    • Burp Proxy 1.7.33
  • 確認日

    • 2018年4月24日(火)

概要シーケンス

やりとりされている内容を見る限り、ざっくり下記のようなシーケンスになっている事が確認できました。

  • 青色部分
    • リクルート内の共通OP(リクルートポイント)での認証&認可のフロー
  • 赤色部分
    • Self-issued OPもどきのフロー

シーケンス.png

以降、詳細を記しますが、

  • パラメータを見やすくするため本来存在しない改行をいれてます
  • 「*****」でマスクされている箇所には実際は文字列が入っていました

ご了承ください。

1. ボタン押下

  • ポンパレモールのアプリを開き、「次へすすむ」ボタンを押下する
  • 一度ログインしてしまっていたので、「*****でログインする」の文言が表示されているもよう

ポンパレ-1.pngポンパレ-2.png

2. 共通OPにAuthZ Req

  • ボタンを押下すると、送付されたリクエストが下記
  • code_challengecode_challenge_methodが送付されており、PKCEに対応している事がわかる:point_up:
  • thumbprintで送られている値は、「5. Self-issued OP AuthZ Res」で送付されるid_tokensubの値
AuthZReq
POST /member/OIDCLogin/?
scope=openid%20r_profile%20r_email%20r_phone%20r_address%20r_ml_magzn%20r_etc&
state=*****&
client_id=*****&
response_type=code&
login_hint=*****&
redirect_uri=https://mypage.ponparemall.com/member/distributionOidc/?appCd=2&
sc_ap=1&
sc_vid=***** HTTP/1.1
Host: point.recruit.co.jp
Content-Type: application/x-www-form-urlencoded

code_challenge=*****&
code_challenge_method=S256&
thumbprint=*****

3. Self-issued OP に AuthZ Req

  • Self-issued OP に対応しているアプリであることを確認
    • 判断基準はよくわかりません
  • 確認できたら Self-issued OP に AuthZ Req
  • Self-issued OP 未対応のアプリではおそらく下記の流れ
    • AuthZ Req を受けて「リクルートポイント」が認証画面を出す
    • ID/PWDで認証を行う
    • 「6 .共通OP AuthZ Res」へ
  • カスタムスキーム経由ではなく「https://point.recruit.co.jp/member/OIDCLogin/verify 」へのリクエストをSelf-issued OP へのAuthZ Reqと判断しているもよう
SIOP_AuthZReq
HTTP/1.1 302 Found
Location: https://point.recruit.co.jp/member/OIDCLogin/verify/?
state=*****&
nonce=*****&
scope=openid&
response_type=id_token&
key_state=registered&
client_id=https%3A%2F%2Fpoint.recruit.co.jp%2Fmember%2FOIDCLogin%2Fverify%2F

4. 認証

  • 初回はID/PWDで認証
  • 以降は画面遷移のみでユーザの操作なし

5. Self-issued OP AuthZ Res

  • 以前やりとりした証明書情報で生成されたid_tokenが発行される
SIOP_AuthZRes
GET /member/OIDCLogin/verify/?id_token=*****&state=***** HTTP/1.1
Host: point.recruit.co.jp
  • 実際のid_tokenの内容はこんな感じ
id_token(header)
{
  "typ" : "JWT",
  "alg" : "RS256"
}
id_token(body)
{
  "iat" : 1524571670,
  "r_terminfo" : "iPhone9,2",
  "iss" : "https:\/\/self-issued.me",
  "sub" : "*****",
  "sub_jwk" : {
    "kty" : "RSA",
    "n" : "*****",
    "e" : "AQAB"
  },
  "aud" : "https:\/\/point.recruit.co.jp\/member\/OIDCLogin\/verify\/",
  "exp" : 1524573470,
  "nonce" : "*****"
}

6. 共通OP AuthZ Res

  • Self-issued OP からのid_tokenの検証をもって、認証完了、レスポンスを返却
  • リダイレクトが以下の通り何回も走ってた
AuthZRes-1
HTTP/1.1 302 Found
Location: https://point.recruit.co.jp/member/twoStepAuth/oidcLoginAuth/?
scope=openid+r_profile+r_email+r_phone+r_address+r_ml_magzn+r_etc&
auth_transct_id=*****&
response_type=code&
state=*****&
insertion_flg=&
prompt=&
nonce=&
redirect_uri=https%3A%2F%2Fmypage.ponparemall.com%2Fmember%2FdistributionOidc%2F%3FappCd%3D2
AuthZRes-2
HTTP/1.1 302 Found
Location: https://point.recruit.co.jp/member/OIDCConsent/?
scope=openid+r_profile+r_email+r_phone+r_address+r_ml_magzn+r_etc&
auth_transct_id=*****&
response_type=code&
redirect_uri=https%3A%2F%2Fmypage.ponparemall.com%2Fmember%2FdistributionOidc%2F%3FappCd%3D2&
state=*****&
sc_ap=1&
client_id=*****&
sc_vid=*****
  • ようやくcodeが渡された
AuthZRes-3
HTTP/1.1 302 Found
Location: https://mypage.ponparemall.com/member/distributionOidc/?
appCd=2&code=*****&
state=*****&
sc_ap=1&
sc_vid=*****

7. 共通OPに Token Req

  • AuthZCode で AccessToken要求
    • でもgrant_typeredirect_uriもないね:thinking:独自仕様かな
  • PKCE に対応しているため、code_verifierの送付必要:exclamation:
    • でもパラメータ名がCamelCaseだね:thinking:
TokenReq
POST /1_1_0/accessTokenIssueOidc/ HTTP/1.1
Host: auth.api.ponparemall.com

appCd=2&
autoLoginFlg=1&
code=*****&
codeVerifier=*****&
deviceUUId=*****&
format=json&
key=*****

8. 共通OP Token Res

  • 要求したscopeにアクセスするためのAccessTokenが発行される
  • rLoginHintの値には「5. Self-issued OP AuthZ Res」で送付されるid_tokensubの値が
  • rUserDisplayNameの値にはログイン時に使ったメールアドレスが
  • Token Responseも何かちょっと違うね:thinking:
TokenRes
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

{
  "authInfo":
    {
      "accessToken":"*****",
      "accessTokenRefreshExpireTs":"2018/04/24 21:37:50",
      "secretToken":"*****",
      "rCapMemberId":"*****",
      "rUserDisplayName":"*****",
      "rLoginHint":"*****"
    }
}

おわりに

ところどころ、Recruitさま独自仕様っぽいものが発見されて面白かったです。
お買い物をするとインタラクション必須となるフローが走るとのことだったのでそちらも試したいところですが、明日早朝からロケなのでここで一旦中断します:woman_tone1::woman_tone1:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0