首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无所不在的dropbox和dropbox-sdk,他们能一起工作吗?

无所不在的dropbox和dropbox-sdk,他们能一起工作吗?
EN

Stack Overflow用户
提问于 2013-06-25 16:17:59
回答 5查看 1.4K关注 0票数 3

自从我看到杂食箱的创业板,被制作成:

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

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

无所不在的dropbox宝石,工作良好,独自一人,我得到认证和其他东西。但是从回调中保存什么,这样dropbox就可以理解用户是经过身份验证的?

如何做到这一点,session.get_access_token将自动处理,由无所不在-dropbox?

代码

代码语言:javascript
复制
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:未经授权。

EN

回答 5

Stack Overflow用户

发布于 2013-06-26 18:24:39

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

一旦您有了令牌和秘密,您应该能够调用session.set_access_token来告诉Dropbox使用什么凭据。

票数 2
EN

Stack Overflow用户

发布于 2013-06-28 13:20:29

因此,我终于结束了使用dropbox编写所有东西

控制器

代码语言:javascript
复制
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

路线

代码语言:javascript
复制
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/home/刷新.html.erb

代码语言:javascript
复制
<script type="text/javascript">
function refreshParent()
{
  window.opener.location.reload();
  if (window.opener.progressWindow) 
    window.opener.progressWindow.close();
  window.close();
}
refreshParent();
</script>

请求dropbox

代码语言:javascript
复制
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,它将返回一个包含在truefalse上设置的'isAuthenticated'键的json字符串。

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

我在这里为那些只想依赖ruby dropbox-sdk的人编写了我的代码。

票数 1
EN

Stack Overflow用户

发布于 2013-08-25 06:43:25

  • omniauth Dropboxv0.2.0使用oauth1 API
  • DropboxSDKv1.5.1使用oauth1 API
  • DropboxSDKv1.6.1使用oauth2 API

使用omniauth dropbox v0.2.0和dropbox v1.5.1,以下控制器操作中的代码对我适用:

代码语言:javascript
复制
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 v1.6.1工作,但我没有找到它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17302455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档