2012-04-10 38 views
1

我正在开发一个Sinatra应用程序,我希望使用OmniAuth。到目前为止,我有类似这样的web应用程序的东西:Sinatra + omniauth + Android,征求意见

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

我想Web应用程序是通过Android手机这将使用一个API,通过令牌的认证方式使用。 API的发展似乎很好这里介绍:

Sinatra - API - Authentication

什么是不明确的,现在我可能会安排在登录过程。推测它将沿着这些线:

  1. 用户选择要使用的服务,例如, Twitter,FaceBook & c。通过Android设备上的应用内按钮。
  2. Android应用程序打开webview以登录到Web应用程序。
  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 2013-11-25 15:56:47