如何使用 2 条腿的 oAuth 的自定义访问令牌签署请求
How to sign requests with custom access token for 2 legged oAuth
我使用 oauth-ruby gem 有一段时间了,我已经实现了两种类型的身份验证:
- 默认一个
- 和自定义,使用
OTP
通过短信发送
它们现在都可以正常工作了
但现在我正在尝试实施新的 (3) 两足 oauth。我 运行 陷入了我实际上无法理解的问题。
由于令牌无效,我使用来自 (3) 的访问令牌的所有签名请求都失败了。对于 (1-2),它可以正常工作。
签名请求是通过RestClient.before_execution_proc
实现的:
RestClient.add_before_execution_proc do |req, params|
access_token.sign!(req)
end
我想问题出在 access_token = OAuth::AccessToken
因为其他 2 个之间存在实际差异。
任何建议或建议都会很有帮助
1.
def default_oauth(login, pass, device: Device.new)
@cookies = login_req(login, pass).cookies
headers = common_headers.merge("Cookie" => @cookies)
#Get request token
request_token = consumer.get_request_token
# Authorize request key
authorize = RestClient.post(base_url + '/oauth/authorize',
{ requestToken: request_token.token, authorize: 'Authorize'},
headers) {|response, request, result| response }
auth_url_resp = RestClient.get(authorize.headers[:location], headers: headers) {|response, request, result| response }
# Get Access key
access_token = request_token.get_access_token
end
2.
def custom_oauth(phone, pin, otp: nil, device: Device.new)
otp = phone.to_s[-5..-1] if otp.nil?
resp = RestClient.post("#{base_url}/rest/smartphone/otp/sms-sender/#{phone}", '', common_headers) {|response, request, result| response }
request_token = consumer.get_request_token
payload = {
device: device.to_h,
otp: otp,
password: pin.to_s,
requestToken: request_token.token
}
headers = json_headers.merge('Cookie' => otp)
authorize = RestClient.post(base_url + '/oauth/otp-authorization',
payload.to_json, headers) {|response, request, result| response }
@access_token = request_token.get_access_token
end
3.
def new_oauth(login, pass, entry, device: Device.new)
tkn = consumer.get_request_token.token
payload = {
username: login,
password: pass.to_s,
requestToken: tkn,
entryPoint: entry,
device: device.to_h
}
headers =json_headers(device.id)
resp = RestClient.post("#{base_url}/oauth/login-authorization", payload.to_json, headers) {|response, request, result| response}
hsh ={oauth_token: resp.headers[:accesstoken], oauth_token_secret: resp.headers[:tokensecret] }
access_token = OAuth::AccessToken.from_hash(consumer, hsh)
end
消费者:
def consumer
@consumer ||= build_consumer
end
def build_consumer
key = 'key_string'
secret ='secret_string'
OAuth::Consumer.new(key, secret, :site => base_url)
end
问题与服务器 (Spring) 编码相关。 oauth-ruby gem 是用于签名创建的转义令牌秘密(组合秘密或加密密钥)。 Spring 默认情况下在服务器端做同样的事情。
取消转义 access_token.secret 解决了这个问题:
access_token.secret = OAuth::Helper.unescape(access_token.secret)
我使用 oauth-ruby gem 有一段时间了,我已经实现了两种类型的身份验证:
- 默认一个
- 和自定义,使用
OTP
通过短信发送
它们现在都可以正常工作了
但现在我正在尝试实施新的 (3) 两足 oauth。我 运行 陷入了我实际上无法理解的问题。 由于令牌无效,我使用来自 (3) 的访问令牌的所有签名请求都失败了。对于 (1-2),它可以正常工作。
签名请求是通过RestClient.before_execution_proc
实现的:
RestClient.add_before_execution_proc do |req, params|
access_token.sign!(req)
end
我想问题出在 access_token = OAuth::AccessToken
因为其他 2 个之间存在实际差异。
任何建议或建议都会很有帮助
1.
def default_oauth(login, pass, device: Device.new)
@cookies = login_req(login, pass).cookies
headers = common_headers.merge("Cookie" => @cookies)
#Get request token
request_token = consumer.get_request_token
# Authorize request key
authorize = RestClient.post(base_url + '/oauth/authorize',
{ requestToken: request_token.token, authorize: 'Authorize'},
headers) {|response, request, result| response }
auth_url_resp = RestClient.get(authorize.headers[:location], headers: headers) {|response, request, result| response }
# Get Access key
access_token = request_token.get_access_token
end
2.
def custom_oauth(phone, pin, otp: nil, device: Device.new)
otp = phone.to_s[-5..-1] if otp.nil?
resp = RestClient.post("#{base_url}/rest/smartphone/otp/sms-sender/#{phone}", '', common_headers) {|response, request, result| response }
request_token = consumer.get_request_token
payload = {
device: device.to_h,
otp: otp,
password: pin.to_s,
requestToken: request_token.token
}
headers = json_headers.merge('Cookie' => otp)
authorize = RestClient.post(base_url + '/oauth/otp-authorization',
payload.to_json, headers) {|response, request, result| response }
@access_token = request_token.get_access_token
end
3.
def new_oauth(login, pass, entry, device: Device.new)
tkn = consumer.get_request_token.token
payload = {
username: login,
password: pass.to_s,
requestToken: tkn,
entryPoint: entry,
device: device.to_h
}
headers =json_headers(device.id)
resp = RestClient.post("#{base_url}/oauth/login-authorization", payload.to_json, headers) {|response, request, result| response}
hsh ={oauth_token: resp.headers[:accesstoken], oauth_token_secret: resp.headers[:tokensecret] }
access_token = OAuth::AccessToken.from_hash(consumer, hsh)
end
消费者:
def consumer
@consumer ||= build_consumer
end
def build_consumer
key = 'key_string'
secret ='secret_string'
OAuth::Consumer.new(key, secret, :site => base_url)
end
问题与服务器 (Spring) 编码相关。 oauth-ruby gem 是用于签名创建的转义令牌秘密(组合秘密或加密密钥)。 Spring 默认情况下在服务器端做同样的事情。
取消转义 access_token.secret 解决了这个问题:
access_token.secret = OAuth::Helper.unescape(access_token.secret)