在OAuth 1.0中,2-legged非常容易:只需像往常一样发送请求并省略access_token标题.
OAuth 2.0中的情况似乎已经发生了变化(我今天发现了很多:)).在OAuth 2.0中,请求不再具有诸如nonce,使用者密钥,时间戳等的标头.这只是替换为:
Authorization: OAuth ya29.4fgasdfafasdfdsaf3waffghfhfgh
Run Code Online (Sandbox Code Playgroud)
我理解3脚授权如何在OAuth 2.0和应用程序流程中工作.但是如何在2.0版本中进行双腿工作?是否可以设计一个既支持2脚和3脚OAuth 2.0的API?
我一直在寻找有关这方面的信息,但我已经找到了很多关于1.0的两条腿的东西,几乎没有2.0的东西.
我试图找到我的方法来解决OAuth规范,它的要求以及我能找到的任何实现,到目前为止,它似乎比它的价值更麻烦,因为我很难找到一个可以将它全部拉到一起的资源.或者也许只是因为我正在寻找比大多数教程更专业的东西.
我有一组现有的API - 一些是Java,一些是PHP - 我现在需要保护它,并且出于多种原因,OAuth似乎是正确的方法.不幸的是,我无法找到合适的资源来帮助我启动和运行提供商,这对该理论提出了挑战.由于大部分将是系统到系统的API使用,我需要实现一个两条腿的提供程序.考虑到这一点...
谢谢你的帮助.
我已经实现了OAuth 1.0a提供程序,并且使用标准的3-legged身份验证,可以使用OAuth客户端成功对其进行身份验证.
OAuth保护我服务器上的REST API,并且我有一个消费它的移动应用程序.
在我的移动应用程序中,我有一些功能(端点),甚至可以在最终用户登录其私人帐户之前访问.
有些用户甚至可能只想在不创建帐户的情况下使用公共功能.
我想用OAuth保护"公共"和"私有用户"端点.
因此,我认为要走的路是以下列方式使用OAuth(但我可能错了......非常错误).
应用程序首次启动后,移动应用程序将首先执行双腿身份验证.这样,移动应用程序将获得"双腿"令牌.移动应用将使用此令牌访问公共端点.
当(以及如果)用户请求登录应用程序时,移动应用程序将执行3-legged身份验证并获得"3-legged token".从现在开始,应用程序将忘记之前的2条腿令牌,并使用3条腿令牌访问公共和私有端点.
1)第一个问题.那有意义吗?还有另一种好办法吗?
现在我的问题是:我怎么能(服务器提供商)知道移动应用程序是否想要使用2-legged进行身份验证?我想,作为提供者,我需要知道为了决定是否将客户端重定向到登录表单以供用户填写(在3脚的情况下)或者我将只发出已经授权的请求令牌(在2脚的情况下),以便可以交换访问令牌(对于3脚).
我这样做的想法是为客户提供2个消费者密钥:一个在他们想要两条腿时使用,一个在他们想要三条腿时使用.我作为提供商,我将根据收到的消费者密钥知道要提供哪些流量.
2)第二(和最后一个问题).这是明智的吗?有没有更好的方法来实现它?
我看到人们通过允许客户端(消费者)发送空访问令牌来实现双腿.是这样的,相反?
谢谢.
我们使用OAuth2保护了我们的REST服务器,并为我们控制的多个客户端应用程序实现了客户端凭据授权类型.现在我们面临的决定是让令牌长期存在(即它们"永不"到期)或者让客户经常进行reAuthenticate(取决于刷新令牌到期).第一个意味着被捕获的令牌可以被恶意方使用,第二个意味着经常暴露客户机密,然后可以用来获取令牌.
哪个在资源服务器到客户端 - 服务器身份验证更安全?如果我们怀疑盗窃,令牌和客户机密密码都可能无效.显然所有通信都是通过https完成的.
目前我们认为客户端密钥比令牌更强大,因此对于这种双腿情况,长寿命令牌应该更好.(对于我们即将实施的任何三条腿授权类型,我们更喜欢用作用户会话的短期令牌).
谢谢你的想法!
我正在尝试在CSharp中创建一个身份验证模块,我需要使用用于2 Legged OAuth的DotNetOpenAuth(DNOA)库来验证请求中的签名,它只有消费者密钥和密钥.
如果您使用DNOA进行任何示例实施2 Legged OAuth,那将会很有帮助.如果没有,任何关于如何实施的想法也会起作用.任何帮助将非常感激.
我正在为我的api构建一个2-legged OAuth提供程序.一切都正常连接,我可以从rails控制台进行签名调用.我遇到的问题是我无法将OAuth集成到controller_spec.
以下是我的服务器上的工作调用示例:
coneybeare $ rails c test
Loading test environment (Rails 3.2.0)
rails test: main
>> consumer = OAuth::Consumer.new("one_key", "MyString", :site => [REDACTED])
# => #<OAuth::Consumer:0x007f9d01252268 @key="one_key", @secret="MyString", @options={:signature_method=>"HMAC-SHA1", :request_token_path=>"/oauth/request_token", :authorize_path=>"/oauth/authorize", :access_token_path=>"/oauth/access_token", :proxy=>nil, :scheme=>:header, :http_method=>:post, :oauth_version=>"1.0", :site=>[REDACTED]}>
ruby: main
>> req = consumer.create_signed_request(:get, "/api/v1/client_applications.json", nil)
# => #<Net::HTTP::Get GET>
ruby: main
>> res = Net::HTTP.start([REDACTED]) {|http| http.request(req) }
# => #<Net::HTTPOK 200 OK readbody=true>
ruby: main
>> puts res.body
{"client_applications":[{"id":119059960,"name":"FooBar1","url":"http://test1.com"},{"id":504489040,"name":"FooBar2","url":"http://test2.com"}]}
# => nil
Run Code Online (Sandbox Code Playgroud)
以下是我在控制器测试中所做的事情:
require 'oauth/client/action_controller_request'
describe …Run Code Online (Sandbox Code Playgroud) 我一直在探索我目前正在开发的REST API的OAuth版本1.0.
我有3个身份验证方案
使用这种情况?我如何能够巧妙地实现Oauth,这又如何帮助我理解3腿和2腿的Oauth流程?
我是否正确地认为 OAuth 1.0a 凭据需要以明文形式存储在服务器上(或者以可以作为明文检索的方式)存储在服务器上,至少在进行 2 腿身份验证时?假设您使用的是 HTTPS 或其他 TLS,这不是比使用用户名和加盐 + 哈希密码安全性低得多吗?有没有一种方法可以存储这些凭据,以便安全漏洞不需要撤销所有凭据?
更详细地说:我正在实现一个 API,并希望使用 OAuth 1.0a 来保护它。未来可能会有许多不同的 API 客户端,但迄今为止唯一一个不需要敏感的用户数据,因此我计划使用“两条腿”OAuth。
据我了解,这意味着我为每个 API 客户端生成一个消费者密钥和一个共享密钥。对于每个 API 请求,客户端都会提供使用者密钥以及使用共享密钥生成的签名。秘密本身不是通过线路发送的,我绝对理解为什么这比直接发送用户名和密码更好。
然而,据我了解,消费者和提供者都必须显式存储消费者密钥和共享秘密(如果我错了,请纠正我),这似乎是一个主要的安全风险。如果攻击者破坏了包含消费者密钥和共享秘密的提供商的数据存储,则每个 API 客户端都将受到损害,重新保护系统的唯一方法就是撤销每个密钥。这与密码相反,密码(理想情况下)永远不会以可逆的方式存储在服务器上。如果您对密码进行加盐和散列处理,那么攻击者将无法仅通过破坏您的数据库来侵入任何帐户。
我所做的所有研究似乎只是通过说“像处理任何敏感数据一样保护凭证”来掩盖这个问题,但这似乎很荒谬。违规确实会发生,虽然它们可能会暴露敏感数据,但它们不应该允许攻击者冒充用户,对吗?
现在,我们有一个Google Docs Api和2 legged oauth的应用程序.但是,我们希望迁移到使用Oauth 2.0的Google Drive Api.
我们可以使用Google Drive Api的2腿oauth吗?有什么例子吗?
有谁知道如何使用google-api-java-client使用2脚OAuth?我正在尝试访问Google Apps Provisioning API以获取特定域的用户列表.
以下不起作用
HttpTransport transport = GoogleTransport.create();
GoogleHeaders headers = (GoogleHeaders) transport.defaultHeaders;
headers.setApplicationName(APPLICATION_NAME);
headers.gdataVersion = GDATA_VERSION;
OAuthHmacSigner signer = new OAuthHmacSigner();
signer.clientSharedSecret = CONSUMER_SECRET;
OAuthParameters oauthParameters = new OAuthParameters();
oauthParameters.version = OAUTH_VERSION;
oauthParameters.consumerKey = CONSUMER_KEY;
oauthParameters.signer = signer;
oauthParameters.signRequestsUsingAuthorizationHeader(transport);
Run Code Online (Sandbox Code Playgroud)
我收到"com.google.api.client.http.HttpResponseException:401 Unknown authorization header".标题看起来像这样
OAuth oauth_consumer_key="...", oauth_nonce="...", oauth_signature="...", oauth_signature_method="HMAC-SHA1", oauth_timestamp="...", oauth_version="1.0"
Run Code Online (Sandbox Code Playgroud)
我也尝试过没有成功
GoogleOAuthDomainWideDelegation delegation = new GoogleOAuthDomainWideDelegation();
delegation.requestorId = REQUESTOR_ID;
delegation.signRequests(transport, oauthParameters);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?提前致谢.
2-legged ×10
oauth ×8
api ×2
oauth-2.0 ×2
rest ×2
security ×2
access-token ×1
c# ×1
google-api ×1
java ×1
php ×1
provider ×1
rspec ×1
two-legged ×1