VB.netでヤフーショッピングAPIのクライアント証明書を使用してアクセストークンを取得する方法


ヤフーショッピングAPIの「注文に関するAPI」のうち、orderList、orderInfo、orderChange
はリフレッシュトークンの有効期限が12時間です。(その他は4週間です。)
証明書認証を行うことで、12時間の有効期限を4週間に延長できます。
(参考:ヤフーショッピング 本番環境の注文APIの証明書による認証の有効期限延長の意味

ヤフーショッピング 本番環境の注文APIの証明書による認証の有効期限延長の意味」をに記述しましたが、アクセストークンを取得するときに、ヤフーショッピングAPIのクライアント証明書を使用する必要はありません。

当時、勘違いしていたので、以下の記事を書きました。

何かの参考になるかもしれないので、一応、記事は残しておきますが、実際に、ヤフーショッピングAPIの「注文に関するAPI」で、有効期限を4週間にしたい場合は、orderList、orderInfo、orderChangeを使用する時に、クライアント証つかってください。

以下、実際には必要のない処理です。

今回は、VB.netでヤフーショッピングAPIのクライアント証明書を使用してアクセストークンを取得する方法を紹介します。

まず、クライアント証明書を取得するためには、ヤフーに申請する必要があります。
ヤフーショッピングAPIのクライアント証明書を申請しました。

クライアント証明書を取得したら、VB.netのHttpWebRequestでリクエストを送信するわけですが、その前に、秘密鍵(keyファイル) とSSLクライアント証明書(crtファイル)を1つにまとめて、PKCS#12形式に変換する必要があります。
Windows用のOpenSSLをインストールしてみました。

次に、アクセストークンを取得する時にしようしたコードを元に書き換えます。
元のコードはこちらです。
VB.net でYahoo APIのアクセストークンを取得してみました。

「System.Security.Cryptography.X509Certificates」をインポートしておきます。

VB.netでヤフーショッピングAPIのクライアント証明書を使用してアクセストークンを取得するコード

    Dim sアプリケーションID As String  
    Dim sシークレット As String  
    Dim sCredentials As String  
    Dim bBytes() As Byte  
    Dim sBase64 As String  
    Dim sAuthorization As String  
    Dim webReq As Net.HttpWebRequest  
    Dim webRes As Net.HttpWebResponse  
    Dim sトークンエンドポイント As String  
    Dim s認可コード As String  
    Dim sリダイレクトURL As String  
    Dim reqStream As Stream  
    Dim resStream As Stream  
    Dim resStreamReader As StreamReader  
    Dim sJSON As String

sアプリケーションID = “アプリケーションID “
sシークレット = “シークレット “
s認可コード = “認可コード “
sリダイレクトURL = ” リダイレクトURL”

Dim sPKCS12Path As String
Dim sPKCS12Password As String
Dim bPKCS12() As Byte
Dim fsPKCS12 As FileStream
Dim x509 As New X509Certificate2

sPKCS12Path = “PKCS12ファイルのパス”
sPKCS12Password = “PKCS12ファイルを生成した時のパスワード”

‘PKCS12ファイルをバイト配列に読み込みます。
fsPKCS12 = New FileStream(sPKCS12Path, FileMode.Open, FileAccess.Read)
ReDim bPKCS12(fsPKCS12.Length - 1)
fsPKCS12.Read(bPKCS12, 0, bPKCS12.Length)
fsPKCS12.Close()

‘X509Certificate2を使用して、証明書ファイルを読み込みます。
x509 = New X509Certificate2(bPKCS12, sPKCS12Password, X509KeyStorageFlags.MachineKeySet)

‘アプリケーションIDとシークレットを「:」(コロン)でつなぎ
sCredentials = sアプリケーションID & ”:” & sシークレット
’Base64でエンコード
bBytes = System.Text.Encoding.ASCII.GetBytes(sCredentials)
sBase64 = Convert.ToBase64String(bBytes)
sAuthorization = String.Concat(“Basic ”, sBase64)
‘Tokenエンドポイント
sトークンエンドポイント = “https://auth.login.yahoo.co.jp/yconnect/v1/token
‘POSTするデータを設定
Dim ht As New Hashtable
ht(“grant_type”) = “authorization_code”
ht(“code”) = s認可コード
’リダイレクトURLは空欄でも動作しました。
ht(“redirect_uri”) = sリダイレクトURL
Dim param As String = ""
For Each k As String In ht.Keys
param += String.Format(“{0}={1}&”, k, ht(k))
Next
Dim data As Byte()
data = System.Text.Encoding.ASCII.GetBytes(param)
‘WebRequestを使用し、Authorizationヘッダーに乗せてアクセス
webReq = DirectCast(System.Net.WebRequest.Create(sトークンエンドポイント), System.Net.HttpWebRequest)
webReq.Method = “POST”
webReq.ContentType = “application/x-www-form-urlencoded”
webReq.ContentLength = data.Length
webReq.Headers(“Authorization”) = sAuthorization
’読み込んだ証明書ファイルをリクエストに乗っけます。
webReq.ClientCertificates.Add(x509)
‘RequestStreamを取得
reqStream = webReq.GetRequestStream()
reqStream.Write(data, 0, data.Length)
reqStream.Close()
‘RequestStreamを取得
webRes = webReq.GetResponse()
resStream = webRes.GetResponseStream()
resStreamReader = New StreamReader(resStream, Encoding.UTF8)
‘レスポンスはJSON形式です。
sJSON = resStreamReader.ReadToEnd
resStreamReader.Close()
resStream.Close()
webRes.Close()

以上です。