前回の記事、「バッチ処理におけるYahoo APIのアクセストークン リフレッシュトークンの処理のフロー」で、「WEBへの導入」「SDKを使用しない場合」の処理により、アクセストークンを取得すれば良いことがわかりました。

(画像引用元:https://developer.yahoo.co.jp/yconnect/)
目次
「Authorization Codeフロー」のよりアクセストークンを取得する方法
まずは、サーバーサイドのアプリケーションを登録します。
Yahoo!ショッピングのストア運営をサポートするAPIを利用したいので、こちらから登録しました。
処理の流れは、こちらです。
全体の流れは、
- 認可コードを取得
- アクセストークン、リフレッシュトークン、IDトークン取得
- リフレッシュトークンでアクセストークンを更新する
です。
1.認可コードを取得
Yahoo APIのアクセストークン 取得 VB.net
上の画像の部分は、
ブラウザでユーザー認可リクエスト画面を開く
↓
ヤフーにログインする
↓
リダイレクトされたURLに含まれる認可コードを取得する。
という意味です。
次のURL(Authorizationエンドポイント)にアクセスします。
[適当な文字列]は、空欄だとエラーになります。
他にもいろいろパラメーターがあります。
詳しくは、こちらを参照してください。
ヤフーにログインする画面に飛ぶので、ログインします。
アプリケーションID登録時に入力した「サイトURL」にリダイレクトされます。
このようなURLになります。
[サイトURL]?code=[コード]&state=xyz
この[コード]の部分が認可コードです。
2.アクセストークン、リフレッシュトークン、IDトークン取得
Tokenエンドポイントにアクセスします。
アプリケーション登録時に発行されたアプリケーションIDとシークレットを「:」(コロン)でつなぎ、Base64でエンコードしたものをAuthorizationヘッダーに乗せてアクセスしてください。
と書いてあるので、これをVB.netで実現します。
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"
'アプリケーション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
'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()
認可コードは、一度使用すると無効になるようです。
2回目以降、
webRes = webReq.GetResponse()
の部分で、400エラーが発生します。
これに気づかず何時間も悩みました。
レスポンスはJSON形式で、次のようになっています。
3.リフレッシュトークンでアクセストークンを更新する
次は、取得したリフレッシュトークンを使用して、アクセストークンを更新します。
grant_typeをにrefresh_token 変更して、
refresh_tokenに取得したリフレッシュトークンを設定してPOSTします。
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 reqStream As Stream
Dim resStream As Stream
Dim resStreamReader As StreamReader
Dim sJSON As String
sアプリケーションID = "アプリケーションID"
sシークレット = "シークレット "
sリフレッシュトークン = "リフレッシュトークン "
'アプリケーション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") = "refresh_token"
ht("refresh_token") = sリフレッシュトークン
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
'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()
レスポンスはJSON形式で、次のようになっています。
新しいアクセストークンに変更されました。
次回は、リフレッシュトークンによるアクセストークン更新の流れに関して考えてみたいと思います。