omn​​iauth-dropbox和dropbox-sdk,它们可以一起工作

时间:2013-06-25 16:17:59

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

因为我看到了omniauth-dropbox宝石,是为了:

  

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

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

omniauth-dropbox gem,工作正常,单独,我得到认证和东西。 但是要从回调中保存什么,所以dropbox-sdk会理解用户是否经过身份验证?

如何操作session.get_access_token将由omniauth-dropbox自动处理?

CODE

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:未经授权。

5 个答案:

答案 0 :(得分:2)

我从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使用哪些凭据。

答案 1 :(得分:1)

所以我终于使用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 /家/ 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>

请求dropbox

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

的人的例子

答案 2 :(得分:0)

  • 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正常工作,但我还没找到。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

对于那些仍在寻找基本执行Dropbox所有内容的教程的人来说,这是我刚才写的教程: http://blog.jobspire.net/dropbox-on-rails-4-0-ajax-using-dropbox-sdk/#more-54

欢迎你!