認可コードグラントタイプ(3-legged OAuth)
Indeed ユーザーアカウントおよび関連付けられた採用企業アカウントに代わって動作するようにアプリを認可します。
本 API および本ドキュメントを利用し、連携を構築することにより、Additional API Terms and Guidelines に同意したものとみなされます。
概要
#認可コードグラントタイプ(3-legged OAuth)を使用すると、アプリが Indeed ユーザーアカウントとそれに関連付けられた採用企業アカウントに代わって動作できます。ユーザーが Indeed にサインインしてアプリのアクセスを承認すると、アプリは発行された認可コードをアクセストークンと交換します。
次のこともできます。
手順
#1. OAuth 認証情報を取得する
#Indeed パートナーになると、Indeed が連携用のアプリを作成します。Partner Console (新しいウィンドウで開きます) にサインインすると、アプリと OAuth 認証情報(クライアント ID とシークレット)を確認できます。API 呼び出しを認証するには、これらの認証情報をアクセストークンと交換します。
アプリで 3-legged OAuth を使用する場合は、Partner Console にリダイレクト URL の許可リストなどの設定も表示されます。
2. 認可コードを取得する
#認可コードを取得するには、ユーザーを Indeed の OAuth 同意画面に誘導します。ユーザーが承認すると、Indeed がリダイレクト URL に認可コードを送信します。認可コードの有効期限は 10 分です。oauth/v2/authorize のレスポンスフィールドをご覧ください。
-
Indeed OAuth 2.0 サーバー(
https://secure.indeed.com/oauth/v2/authorize)へのリクエスト URL を作成します。この例では、
email、offline_access、employer_accessスコープをリクエストします。読みやすくするために改行を入れています。https://secure.indeed.com/oauth/v2/authorize?client_id=c4acac1b35917a14c11947f6564ee28a0758398cd0fdf4deec685c40f14bb8a8&redirect_uri=http%3A%2F%2Fwww.acerecruitersllc.com%2Foauth%2Findeed&response_type=code&scope=email+offline_access+employer_access&code_challenge=<code_challenge>&code_challenge_method=S256&state=employer1234oauth/v2/authorizeのクエリパラメーターは次のとおりです。oauth/v2/authorize のクエリパラメーター クエリパラメーター 必須 説明 client_id✔
クライアント ID です。
redirect_uri✔
URL エンコードされたリダイレクト URL です。サイト上で認可コードを受け取るページを指定します。アプリに登録したリダイレクト URL と一致する必要があります。
response_type✔
常に
codeです。scope✔
アプリがリクエストするスコープです。スペース区切りで指定し、URL エンコードします。URL エンコードにより、スペースはプラス記号(
+)に置き換えられます。state推奨
アプリが生成する一意の文字列です。Indeed がこの値をリダイレクト URI に返すため、コールバックとリクエストを照合し、クロスサイトリクエストフォージェリ(CSRF)攻撃を防ぐことができます。
-
ユーザーをリクエスト URL にリダイレクトします。
Indeed は、アクセスしたいアカウントを所有するユーザーに OAuth 同意画面を表示します。
ユーザーが Allow を選択すると、Indeed は
code、iss、stateクエリパラメーターを付けて、ユーザーをredirect_uriにリダイレクトします。 -
redirect_uriのページでcodeパラメーターを取得します。例:
GET http://www.acerecruitersllc.com/oauth/indeed?code=rXZSMNyYQHQ&state=employer1234&iss=https%3A%2F%2Fsecure.indeed.com
3. 3-legged アクセストークンを取得する
#アクセストークンの有効期間は 1 時間です。アクセストークンを更新するには、3-legged アクセストークンを更新するをご覧ください。
アクセストークンを取得するには、認可コードを指定して https://apis.indeed.com/oauth/v2/tokens に POST リクエストを送信します。
curl -L -X POST 'https://apis.indeed.com/oauth/v2/tokens' \ -H 'Accept: application/json' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=authorization_code' \ -d 'client_id=<client_id>' \ -d 'client_secret=<client_secret>' \ -d 'code=<authorization_code>' \ -d 'code_verifier=<code_verifier>' \ -d 'redirect_uri=http://www.acerecruitersllc.com/oauth/indeed'リクエストヘッダーは次のとおりです。
oauth/v2/tokens のリクエストボディパラメーターは次のとおりです。
| リクエストボディパラメーター | 必須 | 値 |
|---|---|---|
grant_type | ✔ | authorization_code |
client_id | ✔ | クライアント ID です。 |
client_secret | ✔ | クライアントシークレットです。 |
scope | 条件付き | アプリに権限を付与するスコープです。 |
code | ✔ | 認可コードです。 |
code_verifier | ✔ PKCE 使用時 | code_challenge の生成に使用したコード検証値です。コンフィデンシャルクライアントも PKCE を使用することをお勧めします。RFC 7636: Proof Key for Code Exchange by OAuth Public Clients (新しいウィンドウで開きます) をご覧ください。 |
redirect_uri | ✔ | URL エンコードされたリダイレクト URL です。 認可コードの取得に使用したリダイレクト URL と一致する必要があります。 |
{ "access_token": "<access_token>", "convid": "1eis1tplg01fe802", "refresh_token": "<refresh_token>", "scope": "offline_access email", "token_type": "Bearer", "expires_in": 3600}4. 3-legged アクセストークンを更新する
#アクセストークンを更新するには、リフレッシュトークンを指定して https://apis.indeed.com/oauth/v2/tokens に POST リクエストを送信します。
curl -L -X POST 'https://apis.indeed.com/oauth/v2/tokens' \ -H 'Accept: application/json' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=refresh_token' \ -d 'client_id=<client_id>' \ -d 'client_secret=<client_secret>' \ -d 'refresh_token=<refresh_token>' リクエストヘッダーは次のとおりです。
oauth/v2/tokens のリクエストボディパラメーターは次のとおりです。
| リクエストボディパラメーター | 必須 | 値 |
|---|---|---|
grant_type | ✔ | refresh_token |
client_id | ✔ | クライアント ID です。 |
client_secret | ✔ | クライアントシークレットです。 |
refresh_token | ✔ | リフレッシュトークンです。 |
{ "access_token": "<access_token>", "id_token": "<id_token>", "refresh_token": "<refresh_token>", "convid": "1c1a1s8540kkt89p", "scope": "email offline_access", "token_type": "Bearer", "expires_in": 3600}5. Indeed API を呼び出す
#Indeed GraphQL APIを呼び出すには、以下のヘッダーとGraphQLクエリまたはミューテーションを指定してhttps://apis.indeed.com/graphqlにPOSTリクエストを送信します。
curl -L 'https://apis.indeed.com/graphql' \ -H 'Authorization: Bearer <access_token>' \ -H 'Content-Type: application/json' \ -d '{"query":"query {\n jobSearch(\n location: { radius: 5, radiusUnit: MILES, where: \"Austin\" }\n what: \"Nurse\"\n limit: 5\n ) {\n results {\n job {\n title\n sourceEmployerName\n }\n }\n }\n}","variables":{}}'リクエストヘッダー:
| ヘッダー | 値 | 説明 |
|---|---|---|
Authorization | Bearer <token> | このヘッダーを使用してサーバーで認証し、保護されたリソースにアクセスします。このヘッダーで Bearer 認証スキームを使用してアクセストークンを渡します。oauth/v2/tokens エンドポイントでは、リクエストボディで client_id と client_secret を渡す代わりに、Basic 認証スキームを使用します。アクセストークンを取得する、Authorization header (新しいウィンドウで開きます)、およびBasic authentication schemeをご覧ください。 |
Content-Type | application/json | リソースのメディアタイプ (新しいウィンドウで開きます)です。Content-Type ヘッダー (新しいウィンドウで開きます)をご覧ください。 |
-dパラメーターでGraphQLクエリを指定します。
query { jobSearch(location: { radius: 5, radiusUnit: MILES, where: "Austin" } what: "Nurse" limit: 5) { results { job { title sourceEmployerName } } }}{ "errors": [{ "message": "The client does not have access to the 'job-retrieval-service' service.", "extensions": { "code": "INTERNAL_SERVER_ERROR" } }], "data": null}その他のタスク
#採用企業のアクセストークンを取得する
#一部の Indeed API では、雇用主または広告主を表すアクセストークンが必要です。以下の手順では、必要に応じて employer を advertiser に置き換えてください。
ユーザーに次のいずれかの画面を表示します。
どちらの画面でも、ユーザーは自分のアカウントに関連付けられた採用企業から 1 つを選択します。その後、その採用企業のアクセストークンを取得します。
各アクセストークンは 1 つの雇用主を表します。雇用主を切り替えるには、新しいアクセストークンを取得します。
Indeed の採用企業選択画面を表示する
#-
Indeed の採用企業選択画面を表示するには、
prompt=select_employerとscope=employer_accessクエリパラメーターを指定して、https://secure.indeed.com/oauth/v2/authorizeエンドポイントの認可 URL を作成します。https://secure.indeed.com/oauth/v2/authorize?client_id=<client_id>&redirect_uri=https%3A%2F%2Fexample.com%2Foauth&response_type=code&state=random&scope=email+offline_access+employer_access&prompt=select_employerこの URL により、ユーザーに次の画面が表示されます。
Indeed が提供する画面 画面 説明 認証
ユーザーが Indeed からサインアウトしている場合に表示されます。
OAuth 同意
employer_accessなど、アプリがリクエストするスコープをユーザーが承認できます。Indeed の採用企業選択
アカウントに関連付けられた採用企業から、ユーザーが 1 つを選択できます。
ユーザーに表示される OAuth 同意画面をプレビューするには、Partner Console を使用します。
-
ユーザーが採用企業を選択すると、Indeed はリダイレクト URI の
employerパラメーターに採用企業 ID を追加します。https://example.com/oauth/callback?state=random&employer=6d2f02224e30d401810b1726eb246d8d&code=e_IEr5UlBys&iss=https%3A%2F%2Fsecure.indeed.comprompt=select_employerを指定した場合でも、リダイレクト URI に必ずemployerパラメーターが含まれるとは限りません。ユーザーが採用企業を選択しなかった場合や、関連付けられた採用企業がない場合は省略されます。 -
採用企業のアクセストークンを取得します。
カスタムの採用企業選択画面を表示する
#Indeed では、Indeed の採用企業選択画面の使用をお勧めします。独自の画面を作成する場合は、次の手順を実行します。
-
employer_accessとoffline_accessスコープを指定して、3-legged アクセストークンを取得します。レスポンスには、アクセストークン、ID トークン、リフレッシュトークンが 含まれます。
-
ID トークンをデコードして、現在のユーザーの採用企業を一覧表示します。たとえば、JSON Web Tokens Debugger (新しいウィンドウで開きます) を使用します。
-
ユーザーが採用企業を選択できるカスタム画面を作成します。
-
採用企業のアクセストークンを取得します。
採用企業のアクセストークンを取得する
#ユーザーが採用企業を選択したら、その採用企業の ID を指定して https://apis.indeed.com/oauth/v2/tokens に POST リクエストを送信します。
curl -L -X POST 'https://apis.indeed.com/oauth/v2/tokens' \ -H 'Accept: application/json' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=authorization_code' \ -d 'client_id=<client_id>' \ -d 'client_secret=<client_secret>' \ -d 'redirect_uri=http://localhost' \ -d 'code=<authorization_code>' \ -d 'employer=<employer_id>'リクエストヘッダーは次のとおりです。
oauth/v2/tokens のリクエストボディパラメーターは次のとおりです。
| リクエストボディパラメーター | 必須 | 値 |
|---|---|---|
grant_type | ✔ |
または:
リフレッシュトークンを使用する場合、OAuth 同意画面は再表示されません。 |
client_id | ✔ | クライアント ID です。 |
client_secret | ✔ | クライアントシークレットです。 |
code | ✔ authorization_code 使用時 | 認可コードです。 |
redirect_uri | ✔ | URL エンコードされたリダイレクト URL です。 |
refresh_token | ✔ refresh_token 使用時 | リフレッシュトークンです。 |
employer | ✔ | ユーザーが選択した採用企業の ID です。 |
レスポンスには、その採用企業を表すアクセストークンが含まれます。
{ "access_token": "<access_token>", "scope": "employer_access", "token_type": "Bearer", "expires_in": 3600}採用企業がアプリを登録したユーザーに関連付けられていない場合、Indeed は次のエラーを返します。
{ "error_description": "Invalid request", "error": "invalid_request"}このアクセストークンは、同意したユーザーに代わって、この採用企業についてのみ API を呼び出すために使用します。
リフレッシュトークンをアクセストークンと交換するときにも、employer パラメーターを渡すことができます。
ユーザー情報を取得する
#現在のユーザーの情報を取得するには、次のいずれかを使用します。
ID トークン
#ID トークンは、3-legged アクセストークンを取得するときに受け取る、Base64 エンコードされた JSON Web Token(JWT)です。Indeed がユーザーを認証したことを証明し、現在のユーザーの情報を含みます。id_token をご覧ください。
Indeed API はアクセストークンを読み取ります。アプリは ID トークンを読み取って、ユーザーの身元を確認します。
ID トークンには署名が付いています。Indeed の公開鍵で署名を検証します。
https://secure.indeed.com/.well-known/keysID トークンの詳細については、OpenID Connect Core 1.0 incorporating errata set 1 仕様の ID Token (新しいウィンドウで開きます) をご覧ください。
-
ID トークンに
emailとemail_verifiedフィールドを含めるには、emailスコープをリクエストします。 -
アクセストークンを取得します。認可コードを指定して
https://apis.indeed.com/oauth/v2/tokensにPOSTリクエストを送信します。curl -L -X POST 'https://apis.indeed.com/oauth/v2/tokens' \-H 'Accept: application/json' \-H 'Content-Type: application/x-www-form-urlencoded' \-d 'grant_type=authorization_code' \-d 'client_id=<client_id>' \-d 'client_secret=<client_secret>' \-d 'redirect_uri=http://localhost' \-d 'code=<authorization_code>'リクエストヘッダーは次のとおりです。
oauth/v2/tokensのリクエストボディパラメーターは次のとおりです。oauth/v2/tokens のリクエストボディパラメーター リクエストボディパラメーター 必須 値 grant_type✔ authorization_codeまたは:
refresh_tokenリフレッシュトークンを使用する場合、OAuth 同意画面は再表示されません。
client_id✔ クライアント ID です。
client_secret✔ クライアントシークレットです。
code✔ authorization_code使用時認可コードです。 redirect_uri✔ URL エンコードされたリダイレクト URL です。 refresh_token✔ refresh_token使用時リフレッシュトークンです。 レスポンスには
id_tokenフィールドが含まれます。{"access_token": "<access_token>","convid": "1erq23om7t5bu800","scope": "email employer_access","id_token": "<id_token>","token_type": "Bearer","expires_in": 3600} -
JSON Web Tokens Debugger (新しいウィンドウで開きます) などで ID トークンをデコードします。
デコードしたペイロードには、ユーザーのアカウント ID を表す
subフィールドが含まれます。{"sub": "d2d1962c0664d970"}ユーザーが
emailとemployer_accessスコープを付与した場合、ペイロードにはemail、email_verified、employersフィールドも含まれます。{"aud": "a0c3b1092225d3e99f85d7aa3fe1e6001f9a0bb798717cbc2008e58fbda3ef16","sub": "d2d1962c0664d970","employers": [{"id": "13ef9940a7c1f0500a7e411e74178c4e","name": "Dharma Initiative"}, {"id": "6d2f02224e30d401810b1726eb246d8d","name": "Umbrella Corporation"}],"email_verified": true,"iss": "https://secure.indeed.com","exp": 1610417960,"iat": 1610414360,"email": "somebody@indeed.com"}
userinfo エンドポイント
#現在のユーザーのアカウント情報を取得するには、https://secure.indeed.com/v2/api/userinfo エンドポイントを呼び出します。クエリパラメーターやリクエストボディは不要です。
たとえば、Log in with Indeed ボタンを作成するときにこのエンドポイントを呼び出します。
レスポンスには、ID トークンと同じ情報が含まれます。
リクエストが成功すると、HTTP ステータスコード 200 とレスポンスペイロードが返されます。
HTTP/1.1 200 OKContent-Type: application/json
{ "sub": "248289761001", "email": "mina.ray@myemail.world", "email_verified": true}v2/api/userinfo のレスポンスフィールドをご覧ください。
v2/api/userinfo エンドポイントを呼び出すには、次の手順を実行します。
-
emailとemail_verifiedフィールドを取得するには、emailスコープをリクエストします。 -
Authorizationヘッダーにアクセストークンを指定して、https://secure.indeed.com/v2/api/userinfoにGETリクエストを送信します。レスポンスの内容は、ユーザーがアプリに付与したスコープによって異なります。
-
スコープがない場合、レスポンスにはユーザーのアカウント ID である
subのみが含まれます。{"sub": "d2d1962c0664d970"} -
emailスコープがある場合、レスポンスにはemailとemail_verifiedも含まれます。{"sub": "a95064930d19bbc7","email": "somebody+samples@indeed.com","email_verified": true} -
employer_accessスコープがある場合、レスポンスにはアカウントに関連付けられた採用企業(広告主)の一覧も含まれます。{"sub": "bc8c847009a955c9","email": "somebody+employer@indeed.com","email_verified": true,"employers": [{"id": "084a39249af95beedfb90cc5d2b8833c","name": "Dharma Initiative"},{"id": "865e08b649774436ee1f410b611fad7c","name": "Umbrella Corporation"},{"id": "4bc393648e880bc94dd6cef8efbc8486","name": "US Robotics and Mechanical Men"}]}
-
ユーザーを複数の URL に動的にリダイレクトする
#OAuth のセキュリティのベストプラクティスに従い、Indeed では 3-legged OAuth アプリごとに最大 5 つのリダイレクト URL を登録できます。それ以外の宛先にユーザーを送るには、state パラメーターを使用します。
-
認可 URL に
stateパラメーターを追加します。https://secure.indeed.com/oauth/v2/authorize?client_id=6nwwcdklwgktryjw2j5fxh5t2fyneule7zg7mvw3pf9jbx3wmewzlxkdz1jxvs6b&redirect_uri=http%3A%2F%2Fwww.acerecruitersllc.com%2Foauth%2Findeed&response_type=code&scope=email+offline_access+employer_access&state=AnyValue -
Indeed は、リダイレクト URL に
code、iss、stateクエリパラメーターを追加します。GET http://www.acerecruitersllc.com/oauth/indeed?code=rXZSMNyYQHQ&state=AnyValue&iss=https%3A%2F%2Fsecure.indeed.com複数のプロバイダーで認証する場合を除き、
issパラメーターは無視してかまいません。oauth/v2/authorize のレスポンスフィールドをご覧ください。
-
https://somesite.comなどの URL をstateパラメーターで渡すには、URL エンコードします。https://secure.indeed.com/oauth/v2/authorize?client_id=6nwwcdklwgktryjw2j5fxh5t2fyneule7zg7mvw3pf9jbx3wmewzlxkdz1jxvs6b&redirect_uri=http%3A%2F%2Fwww.acerecruitersllc.com%2Foauth%2Findeed&response_type=code&scope=email+offline_access+employer_access&state=https%3A%2F%2Fsomesite.com -
Indeed がユーザーをアプリにリダイレクトしたら、
stateパラメーターを使用して、https://somesite.comなどの別の宛先にリダイレクトします。
認可コードの漏えいを防ぐ
#ユーザーを信頼できない Web サイトにリダイレクトすると、HTTP Referer ヘッダーを通じて認可コードがそのサイトに漏えいする可能性があります。このヘッダーには、リクエスト元のページの URL が含まれます。
state パラメーターが指す Web サイトも認可コードを参照でき、ログに記録する可能性があります。
これを防ぐには、まずアプリ内の別の信頼できるページにユーザーをリダイレクトしてから、信頼できないサイトにリダイレクトします。Referer ヘッダーには直前の URL だけが含まれ、それより前の URL は含まれません。
リダイレクト URI にクエリパラメーターを追加しない
#現在、Indeed では次の例のように、redirect_uri パラメーターにクエリパラメーターを含めることができます。
https://secure.indeed.com/oauth/v2/authorize?client_id=80f9f4bd6a34cac31daebe1a093a606ce6b34e91ae6cfa139432ae387269a529&response_type=code&state=random&scope=email+offline_access+employer_access&redirect_uri=https%3A%2F%2Fsomesite.com%3Freturn%3Dhttps%3A%2F%2Fsomeothersite.comこの例の redirect_uri の値は https://somesite.com?return=https://someothersite.com で、return クエリパラメーターに別のリダイレクト URL が埋め込まれています。
redirect_uri にクエリパラメーターを含める代わりに、state パラメーターを使用してください。
関連項目
#ガイド
#- 認証情報 — アプリが Indeed のサービスを利用するための OAuth クライアント ID とシークレットについて説明します。
- Basic 認証スキーム —
/oauth/v2/tokensのリクエストボディではなく、ヘッダーでクライアント ID とシークレットを送信する方法を説明します。 - OAuthエラーのトラブルシューティング — Indeed API にアクセスする前に発生する OAuth エラーの修正方法を説明します。
- GraphQL エラーをトラブルシューティングする — GraphQL API が返すエラーの診断方法を説明します。
リファレンス
#- HTTP リクエストヘッダー — OAuth リクエストの HTTP リクエストヘッダーの一覧です。
- oauth/v2/tokens エンドポイント — 認可コードまたはリフレッシュトークンをアクセストークンと交換する方法を説明します。
- oauth/v2/tokens のリクエストボディパラメーター —
oauth/v2/tokensエンドポイントのリクエストボディパラメーターの一覧です。 - v2/api/appinfo エンドポイント — アプリを登録したユーザーアカウントに関連付けられた採用企業を一覧表示する方法を説明します。