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

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

新規登録して質問してみよう
ただいま回答率
86.02%
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

解決済

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

Ryosuke.t
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はプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

1回答

0グッド

0クリップ

1432閲覧

投稿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で試しても同様のエラーとなってしまいました。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

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

qnoir

総合スコア7834

Ryosuke.t👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Ryosuke.t

2021/08/17 00:37 編集

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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はプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。