2017-04-05 12 views
1

私はRuby On RailsアプリケーションにYandex Oauthを実装するためにこのguideに従いました。数週間は問題はありませんでしたが、最近(数日前に)問題が発生しています。私の要求が400のエラーコードで失敗するため、アクセストークン、リフレッシュトークンなどを取得できません。Yandex Oauth認証コードは常に期限切れです、Ruby On Rails

私は、この特定のメッセージを受信して​​います:ガイドから

{"error_description": "Code has expired", "error": "invalid_grant"} 

このコードの寿命は10分です。有効期限が切れた場合は、 のコードを再度要求する必要があります。

しかし、私のアプリが認証コードを取得するとすぐに、アクセストークン、リフレッシュトークン、および有効期限のこの認証コードを変更するPOST要求が出るため、10分または10秒も待つことはありません。しかし、このPOST要求は、認証コードが期限切れになっているために失敗します。 - 無効または期限切れの認証コード

invalid_grant:Yandexのエラーの説明から

マイコード:

def yandex 
    require 'net/http' 
    require 'json' # => false 

    @user = User.from_omniauth(request.env["omniauth.auth"]) 

    @client_id = Rails.application.secrets.client_id 
    @secret = Rails.application.secrets.password 
    @authorization_code = params[:code] 

    @user.update_attribute(:code, @authorization_code) 
    @user.update_attribute(:state, params[:state]) 


    @post_body = "grant_type=authorization_code&code=#{@authorization_code}&client_id=#{@client_id}&client_secret=#{@secret}" 

    @url = "https://oauth.yandex.ru/token" 

    url = URI.parse(@url) 
    req = Net::HTTP::Post.new(url.request_uri) 
    req['host'] ="oauth.yandex.ru" 
    req['Content-Length'] = @post_body.length 
    req['Content-Type'] = 'application/x-www-form-urlencoded' 
    req.body = @post_body 
    http = Net::HTTP.new(url.host, url.port) 
    http.use_ssl = (url.scheme == "https") 

    @response_mess = http.request(req) 

    refreshhash = JSON.parse(@response_mess.body) 
    access_token = refreshhash['access_token'] 
    refresh_token = refreshhash['refresh_token'] 
    access_token_expires_at = DateTime.now + refreshhash["expires_in"].to_i.seconds 


    if access_token.present? && refresh_token.present? && access_token_expires_at.present? 
     @user.update_attribute(:access_token, access_token) 
     @user.update_attribute(:refresh_token, refresh_token) 
     @user.update_attribute(:expires_in, access_token_expires_at) 

     sign_in(@user) 
     redirect_to admin_dashboard_index_path 
    end 

end 

マイログ:

Started GET "https://stackoverflow.com/users/auth/yandex/callback?state=31c11a86beecdeb55ab30887d56391a8cbafccdc85c456aa&code=5842278" for 212.3.192.116 at 2017-04-05 15:58:27 +0300 
Cannot render console from 212.3.192.116! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
Processing by CallbacksController#yandex as HTML 
    Parameters: {"state"=>"31c11a86beecdeb55ab30887d56391a8cbafccdc85c456aa", "code"=>"5842278"} 

私はCHROME POSTMANで同じPOSTリクエストを試してみましたが、私が持っている{"error_description": "Code has expired", "error": "invalid_grant"}

と同じ応答を受けグーグルで回ったが、似たような疑問はありません。 Yandexの終わりですが、どうやって周りを回っていますか?

ご協力いただければ幸いです。

答えて

1

Yandex認証コードは一回限りの使用です。 「https://oauth.yandex.ru/token」に2回リクエストしていないことは確かですか? Chrome Postman でこのようなリクエストを試すと、のコードを評価する前に同じことを試すことができます。

+0

私はChrome Postmanで試してみましたが、私のRailsアプリケーションと同じレスポンスを受け取りました。「コードは期限切れです」。 – Edgars

+1

そしてauthorization_codeを取得したときに使用するclient_idは何ですか? 'Rails.application.secrets.client_id'と同じですか? –

+0

はい、私は同じclient_idを使用しました。私はいくつかのシンボル(デバッグ用)を変更した場合、返された要求はそのようなクライアントを見つけることができないか、クライアントは存在しません。正確に覚えていない.. – Edgars

関連する問題