前回の記事、「バッチ処理における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形式で、次のようになっています。
新しいアクセストークンに変更されました。
次回は、リフレッシュトークンによるアクセストークン更新の流れに関して考えてみたいと思います。