好的,我想我明白你在这里要做什么了;我认为最好的方法是从OAuth授权代码授权的一般情况开始,然后转向OmniAuth的具体细节。
您将用户发送到Asana拥有的URL;也就是说,您的目标是让用户访问特定网址。对于Asana来说,这是 https://app.asana.com/-/oauth_authorize 。 (请注意,如果您没有发送正确的错误,我们会回复错误 client_id param,但如果你愿意,可以随意查看该链接)。做 的 不 强> 发送 client_secret 在此请求期间 - 它永远不会涉及客户端代码,因为这是不安全的。
client_id
client_secret
如果他们同意提供访问权限,Asana会使用短期代码向用户的浏览器发回重定向请求。这意味着将使用此代码作为参数从用户的浏览器调用您的服务器,因此必须处理 的 新 强> 来自浏览器的传入请求,指向您指定为重定向URI的任何内容。此外,无论身在何处,所有集成用户都必须可以访问此位置。
您从服务器发送此代码作为POST请求 https://app.asana.com/-/oauth_token 跟你的 client_secret 向Asana提供刷新令牌。这是您的应用程序实际要求凭据的地方;在前几个阶段中给出的令牌只是确认在短时间内,用户已授予您的应用程序权限,要求提供这些凭据,并且 client_secret 确保Asana,对于这个服务器端请求,您的应用程序确实是您的(这就像您的应用程序的密码)。
我们发回一个 access_token 表示(近似)一小时有效的客户端 - 用户凭证对。 您可以使用这些凭据代表此用户访问我们的API。我们还寄回一个 refresh_token 这是长寿的,过去常常昙花一现 access_tokens 他们以非常相似的方式过期后。
access_token
refresh_token
access_tokens
好吧,如果我正确地理解它,它如何与OmniAuth一起使用是因为它希望能够处理几乎所有这些。我将在我们的工作中完成我们的omniauth示例 ruby-asana 客户端库在这里: https://github.com/Asana/ruby-asana/blob/master/examples/omniauth_integration.rb
ruby-asana
您使用您的客户端ID和客户端密钥设置OmniAuth
use OmniAuth::Strategies::Asana, <client_id>, <client_secret>
请求进来,您没有凭据。
get '/' do if $client ... else '<a href="/sign_in">sign in to asana</a>' end end
用户单击登录链接,(代码省略)将它们发送到 sign_in 端点。此端点发出重定向 /auth/asana
sign_in
/auth/asana
浏览器请求 /auth/asana 从我们的服务器。如果你看一下这个例子,它就没有在我们的代码中实现。那是因为 /auth/:provider 由OmniAuth神奇地处理。
/auth/:provider
这就是所有魔法发生的地方。 OmniAuth处理上面的整个登录流程:将浏览器发送到我们的 oauth_authorize 然后,接收回调并将相关的参数保留在环境中,以便它知道“我们只获得了短暂的代码”。当这些线被击中时:
oauth_authorize
creds = request.env["omniauth.auth"]["credentials"].tap { |h| h.delete('expires') } strategy = request.env["omniauth.strategy"]
你在OmniAuth拦截的回调中,得到了所需的信用,并在环境中设置了信用。您不必手动处理oauth回调和令牌交换。
现在,根据您提供的代码,我注意到了一些事情:
request.headers
request.env
我知道这是很多信息,但希望它可以帮助你走上正确的轨道。干杯!