会社行きたくなかったんです。

自由になりたくて会社辞めました

IT Yahoo! ビジネス プログラミング

VB.net でYahoo APIのアクセストークンを取得してみました。

更新日:

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

(画像引用元:https://developer.yahoo.co.jp/yconnect/)

「Authorization Codeフロー」のよりアクセストークンを取得する方法

まずは、サーバーサイドのアプリケーションを登録します。
Yahoo!ショッピングのストア運営をサポートするAPIを利用したいので、こちらから登録しました。

処理の流れは、こちらです。

全体の流れは、

  1. 認可コードを取得
  2. アクセストークン、リフレッシュトークン、IDトークン取得
  3. リフレッシュトークンでアクセストークンを更新する

です。

1.認可コードを取得

Yahoo APIのアクセストークン 取得 VB.net

上の画像の部分は、
ブラウザでユーザー認可リクエスト画面を開く

ヤフーにログインする

リダイレクトされたURLに含まれる認可コードを取得する。

という意味です。

次のURL(Authorizationエンドポイント)にアクセスします。

https://auth.login.yahoo.co.jp/yconnect/v1/authorization?response_type=code&client_id=[アプリケーションID]&nonce=[適当な文字列]

[適当な文字列]は、空欄だとエラーになります。

他にもいろいろパラメーターがあります。

詳しくは、こちらを参照してください。

ヤフーにログインする画面に飛ぶので、ログインします。
アプリケーションID登録時に入力した「サイトURL」にリダイレクトされます。
このようなURLになります。
[サイトURL]?code=[コード]&state=xyz

この[コード]の部分が認可コードです。

2.アクセストークン、リフレッシュトークン、IDトークン取得

Tokenエンドポイントにアクセスします。

※サーバーサイドアプリケーションのTokenエンドポイントアクセス時にはBasic認証が必要です。
アプリケーション登録時に発行されたアプリケーション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形式で、次のようになっています。

{""access_token"":""アクセストークン"",""token_type"":""bearer"",""expires_in"":""3600"",""refresh_token"":""リフレッシュトークン"",""id_token"":""IDトークン""}

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形式で、次のようになっています。

"{""access_token"":""アクセストークン"",""token_type"":""bearer"",""expires_in"":""3600""}"

新しいアクセストークンに変更されました。

次回は、リフレッシュトークンによるアクセストークン更新の流れに関して考えてみたいと思います。

 

-IT, Yahoo!, ビジネス, プログラミング

Copyright© 自由になりたくて会社辞めました , 2024 AllRights Reserved Powered by AFFINGER4.