首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sinatra + omniauth + Android,征求意见

Sinatra + omniauth + Android,征求意见
EN

Stack Overflow用户
提问于 2012-04-10 15:26:06
回答 1查看 1.1K关注 0票数 1

我正在开发一个辛纳特拉应用程序,我想使用OmniAuth。到目前为止,我的web应用程序也有类似的地方:

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

我希望这个web应用程序可以通过Android手机使用,它可以使用API,通过令牌进行身份验证。API的开发似乎在这里得到了很好的介绍:

Sinatra - API - Authentication

不清楚的是,现在我可能会安排登录过程。据推测,这将遵循以下方针:

  1. 用户通过Android设备上的app按钮选择使用什么服务,例如Twitter、FaceBook &c.。
  2. 安卓应用程序打开一个web视图登录到web应用程序。
  3. 令牌被创建,存储在web应用程序的数据库中,并返回到安卓应用程序,以便可以存储并用于后续的API请求。

我不太清楚如何管理第3点--有人有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-11 15:16:57

由于似乎没有人有任何建议,我到目前为止想出的是。不过,我不认为这很好。

我向用户模型添加了一个API密钥,它是在用户首次身份验证时创建的:

代码语言:javascript
复制
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将提供给安卓应用程序,该应用程序可能会将其存储在设备的某个地方:

代码语言:javascript
复制
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调用都受到保护,如我最初文章中的链接所示:

代码语言:javascript
复制
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连接到服务器。任何改进建议都将受到欢迎。

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

https://stackoverflow.com/questions/10091637

复制
相关文章

相似问题

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