【问题标题】:omniauth-dropbox and dropbox-sdk, can they work togetheromn​​iauth-dropbox 和 dropbox-sdk,它们可以一起工作吗
【发布时间】:2013-06-25 16:17:59
【问题描述】:

自从我看到omniauth-dropbox gem 被制作成:

向 Dropbox REST API (v1) 进行身份验证。

我很高兴我不需要开发 OAuth 所暗示的所有重定向。 但是我找不到让它们一起工作的方法:(

omniauth-dropbox gem,工作正常,单独,我通过身份验证等等。 但是要从回调中保存什么,以便dropbox-sdk 了解用户已通过身份验证?

如何做到session.get_access_token 将由omniauth-dropbox 自动处理?

代码

def dropbox
    session = DropboxSession.new(MULTIAPI_CONFIG['dropbox']['appKey'], MULTIAPI_CONFIG['dropbox']['appSecret'])
    session.get_request_token
    authorize_url = session.get_authorize_url('myurl/auth/dropbox/callback')
    print authorize_url
    session.get_access_token
    client = DropboxClient.new(session, ACCESS_TYPE)
    object = client.metadata('/')
    render :json => object
end

错误

无法获取访问令牌。服务器返回 401:未授权。

【问题讨论】:

    标签: ruby-on-rails omniauth dropbox-api


    【解决方案1】:

    在我看来,https://github.com/intridea/omniauth/wiki 好像您可以在回调处理程序中获取 env['omniauth.auth'],然后您可以从那里提取凭据(tokensecret)。见https://github.com/intridea/omniauth/wiki/Auth-Hash-Schema

    获得令牌和密钥后,您应该可以调用 session.set_access_token 告诉 Dropbox SDK 使用什么凭据。

    【讨论】:

    • 我最终只使用了 dropbox-sdk。我将在答案中添加一些代码。我没有尝试您的解决方案,但如果有人来这里,值得一试。
    • 我没有接受您的解决方案作为答案,因为我没有尝试过,但如果有人发现它确实有效,那么我会的。
    【解决方案2】:

    所以我终于用dropbox-sdk写完了所有东西

    控制器

    class DropboxController < ApplicationController
    
        def new
            db_session = DropboxSession.new(MULTIAPI_CONFIG['dropbox']['appKey'], MULTIAPI_CONFIG['dropbox']['appSecret'])
            begin
                db_session.get_request_token
            rescue DropboxError => e
                render template: "multi_api/home/refresh"
            end
    
            session[:dp_request_db_session] = db_session.serialize
    
            # OAuth Step 2: Send the user to the Dropbox website so they can authorize
            # our app.  After the user authorizes our app, Dropbox will redirect them
            # to our 'dp_callback' endpoint.
            auth_url = db_session.get_authorize_url url_for(:dp_callback)
            redirect_to auth_url
        end
    
        def destroy
            session.delete(:dp_authorized_db_session)
            render :json => checkAuth
        end
    
        def isAuthenticated
            render :json => checkAuth
        end
    
        def checkAuth
            val = {'isAuthenticated' => false}
            begin
                unless not session[:dp_authorized_db_session]
                    dbsession = DropboxSession.deserialize(session[:dp_authorized_db_session])
                    client = DropboxClient.new(dbsession, MULTIAPI_CONFIG['dropbox']['accessType'])
                    val = {'isAuthenticated' => true}
                end
            rescue DropboxError => e
                val = {'isAuthenticated' => false}
            end
            val
        end
    
        def callback
            # Finish OAuth Step 2
            ser = session[:dp_request_db_session]
            unless ser
                render template: "multi_api/home/refresh"
                return
            end
            db_session = DropboxSession.deserialize(ser)
    
            # OAuth Step 3: Get an access token from Dropbox.
            begin
                db_session.get_access_token
            rescue DropboxError => e
                render template: "multi_api/home/refresh"
                return
            end
            session.delete(:dp_request_db_session)
            session[:dp_authorized_db_session] = db_session.serialize
            render template: "multi_api/home/refresh"
        end
    
    end
    

    路线

    get   'dp/logout', :to => 'dropbox#destroy'
    get   'dp/login', :to => 'dropbox#new'
    get   'dp/callback', :to => 'dropbox#callback', :as => :dp_callback
    get   'dp/isAuthenticated', :to => 'dropbox#isAuthenticated'
    

    multi_api/home/refresh.html.erb

    <script type="text/javascript">
    function refreshParent()
    {
      window.opener.location.reload();
      if (window.opener.progressWindow) 
        window.opener.progressWindow.close();
      window.close();
    }
    refreshParent();
    </script>
    

    请求保管箱

    dbsession = DropboxSession.deserialize(session[:dp_authorized_db_session])
    @client = DropboxClient.new(dbsession, MULTIAPI_CONFIG['dropbox']['accessType'])
    

    当我想向 Dropbox 验证用户身份时,我会打开一个新选项卡,完成后我会自动刷新原始页面并关闭选项卡(请参阅:multi_pi/home/refresh.html.erb)。

    由于我在 javascript 中执行所有这些操作,因此我需要知道用户是否已成功通过身份验证,这就是为什么我提供了一个路由 dp/isAuthenticated,它将返回一个包含 'isAuthenticated' 密钥的 json 字符串,该密钥设置为 truefalse.

    连接的用户不会保存到数据库中,只会保存到会话中。因此,当会话被销毁时,他们将不得不重新进行身份验证。如果您希望将它们保存到数据库中,那么您应该深入研究@smarx 解决方案,使用omniauth 会容易得多。

    我在这里写了我的代码,作为那些只想依赖ruby dropbox-sdk的人的例子

    【讨论】:

      【解决方案3】:
      • omniauth-dropbox v0.2.0 使用 oauth1 API
      • dropbox-sdk v1.5.1 使用 oauth1 API
      • dropbox-sdk v1.6.1 使用 oauth2 API

      对于 omniauth-dropbox v0.2.0 和 dropbox-sdk v1.5.1,omniauth 重定向到的控制器操作中的以下代码适用于我:

      auth_hash = request.env['omniauth.auth']
      access_token = auth_hash[:credentials][:token]
      access_token_secret = auth_hash[:credentials][:secret]
      
      session = DropboxSession.new(DROPBOX_APP_ID, DROPBOX_ADD_SECRET)
      session.set_access_token(access_token, access_token_secret)
      
      client = DropboxClient.new(session)
      puts client.account_info.inspect
      

      可能有办法让 omniauth-dropbox v0.2.0 和 dropbox-sdk v1.6.1 正常工作,但我还没有找到。

      【讨论】:

      • 正如你所说,这两个库的这两个版本是不兼容的,因为一个只支持 OAuth 1,另一个只支持 OAuth 2。也就是说,omniauth-dropbox 的所有代码都是几十行代码,并且 OAuth 2 比 OAuth 1 更简单。您可以从 github.com/intridea/omniauth-oauth2 开始。
      【解决方案4】:

      正如 James 所说,最新版本的 dropbox-sdk 使用 oauth2,因此您需要使用 oauth2 策略而不是 omniauth-dropbox:

      https://github.com/bamorim/omniauth-dropbox-oauth2

      然后 access_token 将出现在初始 oauth 响应中(作为 auth.credentials.token),您可以像在 omniauth_callbacks_controller 中一样使用它。我将它存储在 Authentication 对象中。

      【讨论】:

        【解决方案5】:

        对于那些仍在寻找教程来执行基本上所有 Dropbox 所做的事情的人,这里有一个我不久前写的教程: http://blog.jobspire.net/dropbox-on-rails-4-0-ajax-using-dropbox-sdk/#more-54

        不客气!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-06
          • 1970-01-01
          • 2013-07-15
          • 1970-01-01
          • 2015-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多