2012-04-10 4 views
1

私はOmniAuthを使用したいSinatraアプリを開発しています。Sinatra + omniauth + Android、アドバイスが求められました

http://codebiff.com/omniauth-with-sinatra

は、私は、Webアプリケーションは、トークンを用いて認証し、APIを使用することになりAndroid携帯電話を経由して利用できるようにしたいと思います。これまでのところ、私は、Webアプリケーションのためにこれに似たものを持っています。 APIの開発はうまくここで説明しているようだ:

Sinatra - API - Authentication

明らかではないが、私は、ログイン手続きを手配するかもしれない、今あります。おそらくそれはこれらの行に沿っているでしょう:

  1. ユーザーは、使用するサービスを選択します。 Twitter、FaceBook & c。、Androidデバイスのアプリ内ボタンを使用します。
  2. AndroidアプリはWebアプリにログインするためにwebviewを開きます。
  3. トークンは何らかの形で作成され、Webアプリケーションのデータベースに格納され、Androidアプリケーションに戻され、後でAPI要求に格納して使用することができます。

ポイント3の管理方法についてはっきりしていません - 誰にも提案はありますか?

答えて

5

誰も何も示唆していないようだから、これまで私がこれまで考え出してきたことは次のとおりです。私はそれがとても良いとは思わない。

私は、ユーザーが最初に認証されたときに作成されたユーザモデルにAPIキーを追加しました:

class User 
    include DataMapper::Resource 
    property :id,   Serial, :key => true 
    property :uid,  String 
    property :name,  String 
    property :nickname, String 
    property :created_at, DateTime 
    property :api_key, String, :key => true 
end 

.... 


get '/auth/:name/callback' do 
    auth = request.env["omniauth.auth"] 
    user = User.first_or_create({ :uid => auth["uid"]}, 
           { :uid => auth["uid"], 
           :nickname => auth["info"]["nickname"], 
           :name => auth["info"]["name"], 
           :api_key => SecureRandom.hex(20), 
           :created_at => Time.now }) 
    session[:user_id] = user.id 
    session[:api_key] = user.api_key 
    flash[:info] = "Welcome, #{user.name}" 
    redirect "/success/#{user.id}/#{user.api_key}" 
end 

承認が動作する場合は、API_KEYはおそらく意志Androidアプリに供給され、どこかのデバイス上でそれを格納します。

get '/success/:id/:api_key', :check => :valid_key? do 
    user = User.get(params[:id],params[:api_key]) 
    if user.api_key == params[:api_key] 
    {'api_key' => user.api_key}.to_json 
    else 
    error 401 
    end 
end 

すべてのAPIコールは私のオリジナルのポスト内のリンクのように保護されています:

register do 
    def check (name) 
    condition do 
     error 401 unless send(name) == true 
    end 
    end 
end 

helpers do 
    def valid_key? 
    user = User.first(:api_key => params[:api_key]) 
    if !user.nil? 
     return true 
    end 
    return false 
    end 
end 

公開用には、サーバーへのSSL接続のみを許可します。改善のための提案は歓迎されるでしょう。

+0

+1あなた自身の解決策を取り戻す – ksiomelo

関連する問題