JWT の作成
弊社のマーケットプレイス統合パイプラインは、現在上限に達しています。加盟店オンボーディング用セルフサービスツール開発する当面の間は、新しいパートナーを受け付けておりません。統合の構築前にDoorDashにお問い合わせいただくには、 マーケットプレイス統合に関するお問い合わせ フォームにご入力ください。
JSON Web Tokens(JWT)は、DoorDash の API との通信に使用される認証用のトークン形式です。情報に関して署名することで、当事者同士が安全に通信することができます。JWT により、サービス利用の際にユーザーが秘密情報を送信することなく信用を証明することが可能になります。また、JWT の作成は、すべての一般的なプログラミング言語でサポートされています。
JWT を使用した API の認証
API で認証を行うには、JWT をベアラートークンとして認証ヘッダーに提供します。
Authorization: Bearer [JWT]
auth-version: v2
JWT の構造
JWT は、ピリオドで区切られた以下の 3 つの部分で構成されています。
- ヘッダー
- ペイロード
- 署名
結果は、「aaa.bbb.ccc
」のような形をしたトークンです。
ヘッダー
ヘッダーには、トークンの署名に使用されたアルゴリズムが指定されます(HMAC SHA 265(HS265)と DoorDash JWT のバージョン(v1))
{
"alg": "HS256",
"typ": "JWT",
"dd-ver": "DD-JWT-V1"
}
ヘッダーは Base64url でエンコードされ、JWT の最初の部分を構成します。
ペイロード
json オブジェクトとしてのトークンの内容です。このコンテンツは、受信者が信頼できる内容です。
ペイロード形式
{
"aud": "doordash",
"iss": DEVELOPER ID,
"kid": KEY ID,
"iat": ISSUED AT,
"exp": EXPIRATION
}
aud\: Audience(オーディエンス)常に「"doordash"
」に設定する。
iss\: Issuer(発行者)デベロッパー ID(UUID 形式)に設定します。
kid\: Key ID(キー ID)JWT の署名に使用された Key ID(UUID 形式)に設定します。
iat\: Issued At(発行時間)トークンが作成された時間のことです。エポック秒でフォーマット化されます。iat を将来にすることはできません。
exp\: Expiration(有効期限)トークンの有効期限のことです。エポック秒でフォーマット化されます。exp の最大値は、発行された時刻から 30 分(1800 秒)後です。
例
{
"aud": "doordash",
"iss": "582e4f20-0f48-4bc2-99c2-e094675e2919",
"kid": "585698aa-2aa6-4bb4-8b3f-dd9d3f47dc28",
"iat": 1636463841,
"exp": 1636465641
}
ペイロードは Base64url でエンコードされ、JWT の 2 番目の部分を構成します。
署名
署名は、コンテンツの真正性を確認するために使用されます。署名シークレットを持っている人だけが、適切な署名をすることができます。署名は、HMAC SHA256(HS256)アルゴリズムによって計算されます。
署名は Base64url でエンコードされ、JWT の 3 番目の部分を構成します。
機密保持
署名シークレットはパスワードと同じように保護しましょう。シークレットを安全な保管場所で保管し、盗難や悪用から守りましょう。
JWT の作成
前提条件
始める前に、開発者ポータルでアクセスキーを作成して保存していることを確認してください。
続行するには、 「developer_id」、「key_id」、および「signing_secret」が必要です
- JavaScript
- Python
- Kotlin
- C#
npm install jsonwebtoken
pip install pyjwt
gradle.properties:
# JWT
jjwtVersion=0.10.6
build.gradle.kts:
dependencies {
testImplementation(kotlin("test"))
val jjwtVersion: String by project
implementation("io.jsonwebtoken:jjwt-api:$jjwtVersion")
implementation("io.jsonwebtoken:jjwt-impl:$jjwtVersion")
implementation("io.jsonwebtoken:jjwt-jackson:$jjwtVersion")
}
dotnet add package System.IdentityModel.Tokens.Jwt
JWT の生成方法
- JavaScript
- Python
- PHP
- Kotlin
- C#
const jwt = require('jsonwebtoken')
const data = {
aud: 'doordash',
iss: '{developer_id}',
kid: '{key_id}',
exp: Math.floor(Date.now() / 1000 + 60),
iat: Math.floor(Date.now() / 1000),
}
const headers = {
algorithm: 'HS256',
header: { 'dd-ver': 'DD-JWT-V1' },
}
const token = jwt.sign(data, Buffer.from('{signing_secret}', 'base64'), headers)
import jwt.utils
import time
import math
token = jwt.encode(
{
"aud": "doordash",
"iss": "{developer_id}",
"kid": "{key_id}",
"exp": str(math.floor(time.time() + 60)),
"iat": str(math.floor(time.time())),
},
jwt.utils.base64url_decode("{signing_secret}"),
algorithm="HS256",
headers={"dd-ver": "DD-JWT-V1"})
function base64UrlEncode(string $data): string
{
$base64Url = strtr(base64_encode($data), '+/', '-_');
return rtrim($base64Url, '=');
}
function base64UrlDecode(string $base64Url): string
{
return base64_decode(strtr($base64Url, '-_', '+/'));
}
$header = json_encode([
'alg' => 'HS256',
'typ' => 'JWT',
'dd-ver' => 'DD-JWT-V1
]);
$payload = json_encode([
'aud' => 'doordash',
'iss' => '{developer_id}',
'kid' => '{key_id}',
'exp' => time() + 60,
'iat' => time()
]);
$base64UrlHeader = base64UrlEncode($header);
$base64UrlPayload = base64UrlEncode($payload);
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, base64UrlDecode({signing_secret}), true);
$base64UrlSignature = base64UrlEncode($signature);
$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
import io.jsonwebtoken.Header
import io.jsonwebtoken.Jwts
import io.jsonwebtoken.io.Decoders
import io.jsonwebtoken.security.Keys
import java.security.Key
import java.time.ZoneOffset
import java.time.ZonedDateTime
import kotlin.collections.HashMap
val claims = HashMap<String, Any?>();
claims["aud"] = "doordash";
claims["iss"] = "{developer_id}";
claims["kid"] = "{key_id}";
claims["exp"] = ZonedDateTime.now(ZoneOffset.UTC).plusMinutes(1).toEpochSecond()
claims["iat"] = ZonedDateTime.now(ZoneOffset.UTC).toEpochSecond();
val keyBytes = Decoders.BASE64URL.decode("{signing_secret}")
val key: Key = Keys.hmacShaKeyFor(keyBytes)
val jwt: String = Jwts.builder()
.setHeaderParam("dd-ver", "DD-JWT-V1")
.setHeaderParam("typ", "JWT")
.setClaims(claims)
.signWith(key)
.compact();
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
var decodedSecret = Base64UrlEncoder.DecodeBytes("{signing_secret}");
var securityKey = new SymmetricSecurityKey(decodedSecret);
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var header = new JwtHeader(credentials);
header["dd-ver"] = "DD-JWT-V1";
var payload = new JwtPayload(
issuer: "{developer_id}",
audience: "doordash",
claims: new List<Claim> { new Claim("kid", "{key_id}") },
notBefore: null,
expires: System.DateTime.UtcNow.AddSeconds(60),
issuedAt: System.DateTime.UtcNow);
var securityToken = new JwtSecurityToken(header, payload);
var token = new JwtSecurityTokenHandler().WriteToken(securityToken);