質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2763閲覧

GASを利用したtoggl plan API認証でのエラー

Ryosuke.t

総合スコア12

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/08/16 06:38

前提・実現したいこと

現在toggl planというサービスとのAPI認証のプログラムを作成しています。
ライブラリで提供されているOAuth2 for Apps Scriptを使用し認証を下記スクリプトのgetServiceを実行したところ、callbackで「invalid_client, Client ID and client credentials do not match」といったエラーが返されてしまいました。
エラーの解決方法や原因等、ご教授お願い致します。

toggl plan API Documentation

エラーメッセージ

Error: Error retrieving token: invalid_client, Client ID and client credentials do not match at Service_.getTokenFromResponse_(Service:553:11) at Service_.fetchToken_(Service:528:15) at Service_.handleCallback(Service:411:20)

該当のソースコード

GAS

1 2/****************************** 3サービスを取得 4******************************/ 5function getService() { 6 7 return OAuth2.createService( "togglPlan" ) 8 .setAuthorizationBaseUrl( "https://plan.toggl.com/oauth/login" ) 9 .setTokenUrl( "https://api.plan.toggl.com/api/v5/authenticate/token") 10 .setClientId( clientId ) 11 .setClientSecret( clientSecret ) 12 .setCallbackFunction( "callback" ) 13 .setPropertyStore( PropertiesService.getUserProperties() ); 14 15} 16 17 18/****************************** 19認証コールバック 20******************************/ 21function callback(request) { 22 23 var service = getService(); 24 var authorized = service.handleCallback(request); 25 if (authorized) { 26 return HtmlService.createHtmlOutput('Success!'); 27 } else { 28 return HtmlService.createHtmlOutput('Error!'); 29 }; 30 31} 32

試したこと

ClientIdやClientSercreは確認しましたが、間違えてはいないようでした。
また、別のClientIdとClientSercreで試しても同様のエラーとなってしまいました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Toggl plan の開発者向け公式ドキュメントの 「Authentication」の項目
「2. Toggl Plan redirects back to your site」を見ると、

If the user accepts your request, Toggl Plan redirects back to your site with a temporary code in a code parameter as well as the state you provided in the previous step in a state parameter. If the states don’t match, the request has been created by a third party and the process should be aborted.

Exchange this for an access token:

POST https://api.plan.toggl.com/api/v5/authenticate/token Authorization: Basic Base64(CLIENT-ID:CLIENT-SECRET)

と書いてあります。(client_secret_basic という認証方式)

したがって、Oauth2ライブラリがリダイレクトを受けた後トークンエンドポイントにトークンリクエストを投げる際、
client-id(togglでは"App Key")とclient-secret(同"Secret")をコロン(:)で連結してBASE64にエンコードした文字列を、Authorizationヘッダに含めるように設定しておかなければなりません。

具体的には、下記のようにします。(setTokenHeaders()関数)

js

1function getService() { 2 3 return OAuth2.createService( "togglPlan" ) 4 .setAuthorizationBaseUrl( "https://plan.toggl.com/oauth/login" ) 5 .setTokenUrl( "https://api.plan.toggl.com/api/v5/authenticate/token") 6 .setClientId( clientId ) 7 .setClientSecret( clientSecret ) 8 .setTokenHeaders({ 9 'Authorization': 'Basic ' + Utilities.base64Encode( clientId + ':' + clientSecret ) 10 }) 11 .setCallbackFunction( "callback" ) 12 .setPropertyStore( PropertiesService.getUserProperties() ) 13 14}

参照:https://github.com/googleworkspace/apps-script-oauth2#advanced-configuration

投稿2021/08/16 11:52

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryosuke.t

2021/08/17 00:37 編集

setTokenHeaders()関数を使用したところ、無事認証をすることができました。 ご教授ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問