ごった煮

色々な事を書いてます

Botの認証トークンを更新する

DirectLineで取得するトークンは、原則30分で有効期限が切れるのでそれを更新する方法についてです。

初めに

この操作もREST APIを呼び出します。

例のごとくSwaggerドキュメントは、ここ です。

APIの仕様

以下APIの仕様です

レスポンス内容

レスポンスは、単純にTokenが落ちてくるのでJsonではなく生のテキストになります。

コード例

C#

C#だと以下のような感じです。

        private static async Task RenewToken(string conversationId, string token)
        {
            var httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri(baseUrl);
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", token);
            var response = await httpClient.GetAsync($"/api/tokens/{conversationId}/renew");
            var newToken = await response.Content.ReadAsStringAsync();
            newToken = newToken.Replace('"', ' ').Replace('\\', ' ').Trim();

        return newToken;
    }

レスポンスが、”\”token\””という形で取得されるので無駄なテキストを削除する処理を最後に入れています。

Go

Goだと以下のような感じです。

func RenewToken(token string, conversationID string) string {
    client := &http.Client{}
    url := "https://directline.botframework.com/api/tokens/" + conversationID + "/renew"
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Authorization", "Botconnector " + token)
    res, _ := client.Do(req)
    body, _ := ioutil.ReadAll(res.Body)
    defer res.Body.Close()
    
    fmt.Println(string(body))
    
    return string(body)
}

まとめ

実際のアプリを作る場合は、必ずタイマーとこの処理を入れて有効期限が切れないように気を付けましょう