Net::Google::Analytics::OAuth2 で「エラーredirect_uri_mismatch」って言われてrefresh_access_tokenが取得できない時の対処方法

Net::Google::Analytics::OAuth2 で「エラーredirect_uri_mismatch」って言われてrefresh_access_tokenが取得できない時の対処方法

refresh_access_tokenの取得

Google AnalyticsのAPIを活用してごにょごにょしたくてPerlでGoogle AnalyticsへアクセスするならNet::Google::Analyticsが便利 - ゆーすけべー日記を参考に試していたのだけれど、refresh_access_tokenが取得できない。

use Net::Google::Analytics::OAuth2;

my $oauth = Net::Google::Analytics::OAuth2->new(
    client_id     => 'your_client_id',
    client_secret => 'your_client_secret',
);

$oauth->interactive;

refresh_access_tokenを取得するのに上記のようなコードを実行する。

$ ./analytics.pl 
Please visit the following URL, grant access to this application, and enter
the code you will be shown:

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=your_client_id&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics.readonly

Enter code: 

実行すると表示されるURLにアクセスして入手できるコードを入力し

エラー内容はこんなの

エラーredirect_uri_mismatch

The redirect URI in the request: urn:ietf:wg:oauth:2.0:oob did not match a registered redirect URI

このエラーはリダイレクトするURIが正しく設定されていないため表示されるので引数を足してあげるとうまくいく。

my $analytics = Net::Google::Analytics->new;
my $oauth = Net::Google::Analytics::OAuth2->new(
        client_id => 'your_client_id',
        client_secret => 'your_client_secret',
        redirect_uri => 'http://localhost/oauth2callback',
);
$oauth->interactive;

らしいのだけど、まだエラーが出る。

解決方法

Google Cloud Consoleへ行ってAPIの設定をする

https://cloud.google.com/console#/projectへ行き、設定する。

特に重要そうな項目は

  • 「APIと認証 > 登録済みアプリ > OAuth 2.0 クライアントID」の項目中の「リダイレクトURI」を設定する
  • 「APIと認証 > 登録済みアプリ > 同意画面 の設定

ここに漏れがあるとエラーになります。また、ここで設定するリダイレクトURIとリクエストするredirect_uriが一致しないとエラーが出ます。

Refresh tokenが表示されない対処

Net::Google::Analytics::OAuth2 ’3.01′ では approval_prompt、access_type のパラメータは、考慮されていないようなので refresh_token の取得スクリプトに表示されたものに approval_prompt=force&access_type=offline を追記してアクセスし

という事なので、先程のURLに approval_prompt=force&access_type=offline を足してアクセスすればおk.

参考