3

このトピックに関する他の質問を見ましたが、私のエラーと一致していないようです。 Google Sheets APIv4を実行しているとき、私はエラーを取得しています:HttpAccessTokenRefreshError:invalid_grant ... 1時間制限のリフレッシュトークン

raise HttpAccessTokenRefreshError(error_msg, status=resp.status) HttpAccessTokenRefreshError: invalid_grant

エラーこのエラーはのみ時々ポップアップ表示ラインservice.spreadsheets().values().get(spreadsheetId=key, range=ranges).execute()

で発生します。私は何もしないで、もう一度コードを実行してください。これは、再び認証フロープロセスを介して私を取るだろうと私は同じHttpAccessTokenRefreshError: invalid_grantが再び持ち上がるまで

Authentication successful. Storing credentials to C:\Users\jason\.credentials\sheets.googleapis.com-python-quickstart.json

はその後、私はしばらくの間、任意のコードを実行することができます取得し、私は再び再認証する必要があります。

どうすればよいですか?

developers.google.com/sheets/api/quickstart/pythonのコードを使用しています。

私は

import time 
import os 
try: 
    import ntplib 
    client = ntplib.NTPClient() 
    response = client.request('pool.ntp.org') 
    os.system('date ' + time.strftime('%m%d%H%M%Y.%S',time.localtime(response.tx_time))) 
except: 
    print('Could not sync with time server.') 

print('Done.') 

次が、取得に時間を同期するntpを使用しようとしました:私は、現在の日付を入力した後

The system cannot accept the date entered. 
Enter the new data: (mm-dd-yy) 

、何も起こりません。

このページも見てきました。 https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35#.5utz2vcn6

この問題は、終了するのに1時間を超えるコードを実行した場合にも発生します。リフレッシュトークンで。それはいつも爆弾です。

私はトークンが1時間しか残っておらず、リフレッシュすると常に爆弾だと思っています。私は接続するためのコードを掲載している

:一般的な考え方として

class APIv4: 
    def __init__(self): 
    credentials = get_credentials() 
    http = credentials.authorize(httplib2.Http()) 
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?' 
        'version=v4') 
    self.service = discovery.build('sheets', 'v4', http=http, 
           discoveryServiceUrl=discoveryUrl) 

def get_credentials(): 
    """Gets valid user credentials from storage. 

    If nothing has been stored, or if the stored credentials are invalid, 
    the OAuth2 flow is completed to obtain the new credentials. 

    Returns: 
     Credentials, the obtained credential. 
    """ 
    home_dir = os.path.expanduser('~') 
    credential_dir = os.path.join(home_dir, '.credentials') 
    if not os.path.exists(credential_dir): 
     os.makedirs(credential_dir) 
    credential_path = os.path.join(credential_dir, 
            'sheets.googleapis.com-python-quickstart.json') 

    store = Storage(credential_path) 
    credentials = store.get() 
    if not credentials or credentials.invalid: 
     flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) 
     flow.user_agent = APPLICATION_NAME 
     if flags: 
      credentials = tools.run_flow(flow, store, flags) 
     else: # Needed only for compatibility with Python 2.6 
      credentials = tools.run(flow, store) 
     print('Storing credentials to ' + credential_path) 
    return credentials 
+0

OAuthに問題がある場合は、このようにAPIキーを使用してみてください。また、OAuthは[Sheets APIのサポートされている資格情報](https://developers.google.com/sheets/api/guides/authorizing#APIKey)です。 )。 APIキーを取得すると、アプリケーションはクエリパラメータ 'key = yourAPIKey'をすべてのリクエストURLに追加できます。 –

+0

@ Mr.Rebotこれを設定する方法のサンプルコードを教えてください。私はサービスのビルドとそれがGoogleシートAPIv4でどのように動作するのか理解していません。あなたのリンクをたどって私のコンソールから資格情報でAPIキーを取得しました。私のデータが公開されていないため、これが私にとってうまくいくかどうかはわかりません。プライベートユーザデータにはアクセスしないという。 – jason

+0

@ Mr.Rebot "このようにAPIキーを使用してみてください。また、OAuthは両方ともSheets APIによって証明書の種類をサポートしています。正しくないAPIキーは、スプレッドシートが公開されている場合にのみ機能します。 – pinoyyid

答えて

1

は、呼び出し間でのアクセストークンのリフレッシュに問題があるように思われます。

どちらかそれは私がこの問題に記載されている可能性を研究し提案

(最初のオプションよりも少ないようですが)自分の資格情報の一部が正しく渡されていないか、いくつかの問題がローカルマシンの時間であることを意味します。 https://github.com/google/oauth2client/issues/451

  1. (少ない)はなぜにntpdateとクロック更新を強制しようとしないでください。私がいることを信じて、このguideと上記の勧告に続き

    :ユーザーが自分

  2. Ok. After a loong research I guess I found out the problem. In fact, refresh_token was missing from the user credential, but the issue was tricky.

    The refresh token is given for the FIRST time when the application asks the user for permissions. The refresh token is given ONLY IF the flow's step 1 includes the parameters approval_prompt="force"

    For some reason the user (me) hadn't got refresh_token in user's credentials, so I revoked permissions from the application on My Account -> Security -> Applications, and restarted the OAuth dance again. Now I got refresh_token.

のために働いていること#2オプションの更新を述べたので、NTPをインストールし、それを試してみますあなたは(ガイドから直接取得)このコードスニペットに追加する必要があります。

# Create a state token to prevent request forgery. 
# Store it in the session for later validation. 
state = hashlib.sha256(os.urandom(1024)).hexdigest() 
session['state'] = state 
# Set the client ID, token state, and application name in the HTML while 
# serving it. 
response = make_response(
    render_template('index.html', 
        CLIENT_ID=CLIENT_ID, 
        STATE=state, 
        APPLICATION_NAME=APPLICATION_NAME)) 

prompt=consentライン、その後トンを実行します上記の引用された回答の第3段階(オプション2)。

もう1つの方法はapproval_prompt=forceですが、それらがうまく機能しないため、どちらかを選択する必要があります。

幸運:)

+0

あなたは#2をステップに壊して、より明確にすることができますか、私はそれを理解していません。 – jason

+0

@ jason私は私の答えを編集しました、それが助けてくれることを願っています –

+0

ええ。 http:// stackoverflow。co.jp/questions/10827920/not-receiving-google-oauth-refresh-token/10857806#10857806これが私の答えです。私は 'offline'と' force'プロパティを追加しました。そして今1時間過ぎて走っています。 – jason

1

いくつかの考え....あなたが投稿

timekit.ioブログのリンクは、代替案を走るにはかなり良いです。あなたのケースでは、時間関連のように聞こえず、ntpは過剰です。あなたの時間が多かれ少なかれ限り、あなたは大丈夫でしょう。

コードが実行され、1時間後に「無効な許可」が失敗します。つまり、何かが新しいアクセストークンを生成して失敗するためにリフレッシュトークンを使用しようとしています。自分でリフレッシュする場合は、リフレッシュトークンを正しく取得して使用していることを確認してください。私の推測では、これを行うにはGoogle Pythonライブラリに頼っているということです(ライブラリを嫌う人は嫌です)。

だから、私にとって最も可能性の高い原因は次のとおりです。 -

のリフレッシュトークン
  1. が正しく保存され、
  2. のリフレッシュトークンが古いリフレッシュのために使用することが復元されていない(つまり、より多くの。 25リフレッシュトークン古い)。これは、開発中に繰り返しテストを実行する場合に発生します。常に最新のRTを使用していることを確認してください。
  3. リフレッシュトークンは、ユーザーが初めてアプリケーションを承認したときにのみ提供されるため、nullです。 https://myaccount.google.com/permissions?pli=1にアクセスしてアプリへのアクセス許可を削除してから、もう一度やり直してください。

httpトレースをキャプチャできれば、デバッグに多く役立ちます。 Pythonライブラリにあなたが有効にできるデバッグ/ログ機能があるかどうかを調べます(私はJavaライブラリが知っていることを知っています)。

+0

私は認証するコードを掲載しました。見てください。私は基本的にGoogleのウェブサイトからスタートアップガイドのコードを使用した。 – jason

+0

残念ながら、GoogleのPythonライブラリを使用したことはありません。資格情報を使用する直前に、リフレッシュトークンが有効であることを確認することをお勧めします。また、私のアイテム3を試してください。権限を削除してもう一度お試しください。 – pinoyyid

関連する問題