我被困在/阻止这一点,我继续发出此错误消息'代码已被兑换' 3个步骤:
当我尝试使用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
答案 0 :(得分:1)
我不能用红宝石帮助你,但我可以告诉你“代码已被兑换”的含义。
当您向Google进行身份验证时,有三个步骤。
authentication code
将返回给主叫客户端应用程序。authentication code
交换access token
,有时为refresh token
。然后可以使用访问令牌来访问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.code = request['code']
$auth.grant_type = 'authorization_code'
$token = $auth.fetch_access_token!
你可以使用你的令牌等等
这并不容易,但我希望facebook不会太差异