3

因为我看到了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:未经授权。

4

5 回答 5

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 要使用的凭据。

于 2013-06-26T18:24:39.440 回答
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/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'设置为trueor的密钥的 json 字符串false

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

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

于 2013-06-28T13:20:29.043 回答
0

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

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

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

于 2014-07-28T04:47:46.717 回答
0

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

别客气!

于 2014-10-13T05:18:28.800 回答
0
  • omn​​iauth-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 工作,但我还没有找到。

于 2013-08-25T06:43:25.827 回答