3

omn​​iauth-dropbox gem が次のように作成されていることがわかりました。

Dropbox REST API (v1) に対して認証します。

OAuth が意味するすべてのリダイレクトを開発する必要がないことをうれしく思いました。しかし、私はそれらを一緒に動作させる方法を見つけることができません:(

omn​​iauth-dropbox ジェムは、単独で正常に動作し、認証を受けます。しかし、ユーザーが認証されていることをdropbox-sdkが理解できるように、コールバックから何を保存すればよいでしょうか?

どうすればsession.get_access_tokenomniauth-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']を抽出できます。https://github.com/intridea/omniauth/wiki/Auth-Hash-Schemaを参照してください。tokensecret

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を含むjson文字列を返すルートを提供しました。'isAuthenticated'truefalse

接続ユーザーはデータベースには保存されず、セッションにのみ保存されます。そのため、セッションが破棄されると、再認証する必要があります。それらをデータベースに保存する場合は、@smarx ソリューションを掘り下げる必要があります。omniauth を使用すると、はるかに簡単になります。

ruby dropbox-sdkだけに依存したい人のための例として、ここにコードを書きました。

于 2013-06-28T13:20:29.043 に答える
0

James が言うように、dropbox-sdk の最新バージョンは oauth2 を使用しているため、omniauth-dropbox の代わりに oauth2 戦略を使用する必要があります。

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

次に、access_token が最初の oauth 応答に (auth.credentials.token として) 存在し、omniauth_callbacks_controller で行うようにそれを使用できます。Authentication オブジェクトに保存します。

于 2014-07-28T04:47:46.717 に答える