1

OmniAuth を使用したい Sinatra アプリを開発しています。これまでのところ、Web アプリには次のようなものがあります。

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

API を使用し、トークンによる認証を行う Android フォンで Web アプリを使用できるようにしたいと考えています。API の開発は、ここでうまくカバーされているようです。

シナトラ - API - 認証

明確ではないのは、ログイン手順を調整する可能性があることです。おそらく、次のようになります。

  1. ユーザーは、Android デバイスのアプリ内ボタンを使用して、使用するサービス (Twitter、FaceBook など) を選択します。
  2. Android アプリは Web ビューを開き、Web アプリにログインします。
  3. トークンは何らかの方法で作成され、Web アプリのデータベースに保存され、Android アプリに返されます。これにより、トークンを保存して後続の API 要求に使用できるようになります。

ポイント3がどのように管理されるかについてはよくわかりません-誰か提案はありますか?

4

1 に答える 1

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アプリに提供され、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接続のみを許可します。改善のための提案は大歓迎です。

于 2012-04-11T15:16:57.893 に答える