代码已被赎回......但在哪里?

时间:2017-12-11 09:24:25

标签: ruby-on-rails google-api

我被困在/阻止这一点,我继续发出此错误消息'代码已被兑换' 3个步骤:

  • 获取授权URL(SignetLogin)
  • 调用它并检索授权码(SignetAuth)
  • 获取刷新令牌并调用google API(SignetInsert)

当我尝试使用API​​时,我总是会收到以下错误消息:代码已被兑换'。

我请求一些帮助,有什么问题,我在哪里可以找到一些提示?我错过了什么?

谢谢 - 格雷瓜尔

def SignetLogin
    auth = Signet::OAuth2::Client.new(
    :authorization_uri =>     'https://accounts.google.com/o/oauth2/auth',
    :scope =>                 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/calendar',
    # :state =>                 'useful_dynamic_string',    # What is that ?
    :redirect_uri =>          'http://localhost:3000/auth/google_oauth2/callback',
    :client_id =>             $client_id,
    :client_secret =>         $client_secret
    )
    redirect_to auth.authorization_uri.to_s
end


def SignetAuth
    $code = request['code']
    auth = Signet::OAuth2::Client.new(
    :token_credential_uri =>  'https://accounts.google.com/o/oauth2/token',
    :redirect_uri =>          'http://localhost:3000/SignetInsert',
    :client_id =>             $client_id,
    :client_secret =>         $client_secret,
    :code =>                  request['code']

)
end


def SignetInsert
    auth = Signet::OAuth2::Client.new(
    token_credential_uri:       'https://accounts.google.com/o/oauth2/token',
    redirect_uri:               'http://localhost:3000/',
    # redirect_uri: 'http://localhost:3000/auth/google_oauth2/callback',
    :client_id =>               $client_id,
    :client_secret =>           $client_secret,
    :code =>                     $code
    )
    # puts auth.fetch_access_token!

    calendar = Google::Apis::CalendarV3::CalendarService.new
    calendar.authorization = auth
    calendar_id = 'primary'

    @result = calendar.list_events(calendar_id,
                               max_results: 10,
                               single_events: true,
                               order_by: 'startTime',
                               time_min: Time.now.iso8601)
end

2 个答案:

答案 0 :(得分:1)

我不能用红宝石帮助你,但我可以告诉你“代码已被兑换”的含义。

当您向Google进行身份验证时,有三个步骤。

  1. 向用户显示同意书
  2. 假设用户已同意,则authentication code将返回给主叫客户端应用程序。
  3. 主叫客户与authentication code交换access token,有时为refresh token
  4. 然后可以使用访问令牌来访问API。访问令牌在一小时后过期,您可以使用刷新令牌来请求新的访问令牌。

    作为auth流程的一部分返回的身份验证代码只能使用一次来获取访问令牌和刷新令牌。 "Code was already redeemed'表示您正在尝试使用已使用过的代码。

    就像我说我不太了解红宝石,但这可能有助于google apis ruby client

答案 1 :(得分:0)

感谢所有人的提示和答案,你给了我一条路! 这并不容易,但我在你的帮助下做到了,再次感谢

所以,答案是多方的:

1 /刷新令牌不是每次都提供,只是第一次,这个网址allow you to dis-authorize your app并在答案中再次提供

2 /本文gave some tips关于如何开始,但绝对不会给你'正确'的方式2

3 /据我所知,使用'干净'请求(见步骤1)

  • $ auth = Signet :: OAuth2 :: Client.new,你检索一个authorization_uri,你重定向到(别忘了to_s)
  • 谷歌显示它的表格,要求授权 - Google会重定向您服务器上的用户,您只需检索access_token和refresh_token第一次(请参阅步骤1取消授权并再次使用refresh_token - 而且,因为你(或我)无法猜到它:

$auth.code = request['code'] $auth.grant_type = 'authorization_code' $token = $auth.fetch_access_token!

你可以使用你的令牌等等

这并不容易,但我希望facebook不会太差异