我们将在Sinatra开发一个小API应用程序。什么是可用于保护API调用的身份验证选项?Sinatra - API - 身份验证
56
A
回答
88
Sinatra没有内置的认证支持。有一些宝石可用,但大多数都是为用户认证而设计的(即用于网站)。对于一个API来说,它们看起来像是矫枉过正。制作你自己的作品很容易。只需检查每个路由中的请求参数,看看它们是否包含有效的API密钥,如果不是,则返回401错误。 error
呼吁halt
内部,其停止持续的要求 - 如果你的valid_key?
方法返回false调用error
后
helpers do
def valid_key? (key)
false
end
end
get "/" do
error 401 unless valid_key?(params[:key])
"Hello, world."
end
# $ irb -r open-uri
# >> open("http://yourapp.com/api/?key=123")
# OpenURI::HTTPError: 401 Unauthorized
不会发生任何事情。
当然,在每条路线的开始重复检查并不理想。相反,你可以创建一个小的扩展,增加了条件,以你的路由:
class App < Sinatra::Base
register do
def check (name)
condition do
error 401 unless send(name) == true
end
end
end
helpers do
def valid_key?
params[:key].to_i % 2 > 0
end
end
get "/", :check => :valid_key? do
[1, 2, 3].to_json
end
end
如果你只是想上的所有路由认证,使用before
处理程序:
before do
error 401 unless params[:key] =~ /^xyz/
end
get "/" do
{"e" => mc**2}.to_json
end
2
http://www.secondforge.com/blog/2014/11/05/simple-api-authentication-in-sinatra/有一个稍微更详细使用用户令牌的答案。
这一步比API密钥更复杂,但必要的,如果你的API需要认证登录用户做的事情,如编辑名称/电子邮件/密码,或访问每用户信息。 (即“私人”API行动)。您也可以撤销/到期用户令牌让人注销等
class App < Sinatra::Base
before do
begin
if request.body.read(1)
request.body.rewind
@request_payload = JSON.parse request.body.read, { symbolize_names: true }
end
rescue JSON::ParserError => e
request.body.rewind
puts "The body #{request.body.read} was not JSON"
end
end
post '/login' do
params = @request_payload[:user]
user = User.find(email: params[:email])
if user.password == params[:password] #compare the hash to the string; magic
#log the user in
else
#tell the user they aren't logged in
end
end
end
(这是值得大家注意的,它是更常见的是从一个HTTP头,而不是JSON体读取的凭据,但笔者提到, 。)
相关问题
- 1. Sinatra的API身份验证
- 2. Webtrends API身份验证PHP
- 3. Loopback API Explorer身份验证
- 4. Laravel rest api身份验证
- 5. C#Google API身份验证
- 6. Google API身份验证
- 7. BMC Remedy API身份验证
- 8. Facebook API身份验证
- 9. 身份验证OneDrive Python API
- 10. REST API MongoDB身份验证
- 11. 安全API身份验证
- 12. Imgur api身份验证PHP
- 13. vb.net woocommerce api身份验证
- 14. Withings api身份验证
- 15. Outlook 365 API - 身份验证
- 16. API身份验证流程
- 17. OpenTok API身份验证
- 18. Keyvault身份验证(REST API)
- 19. REST API身份验证
- 20. Sitecore的身份验证使用API身份验证/登录
- 21. API身份验证和OAuth2的使用
- 22. jquery身份验证
- 23. Mongodb身份验证
- 24. Smtp身份验证
- 25. Firebase身份验证
- 26. 禁用其他身份验证的HTTP基本身份验证
- 27. SymbolSource身份验证
- 28. 2因子Windows身份验证的强身份验证
- 29. 使用Cognito联合身份验证的API网关身份验证
- 30. Web Api客户端身份验证(非用户身份验证)最佳实践
托德Yandell,非常感谢您的详细的答案和你花在它上面的时间。我真的很感激。这真的很有帮助。 Imran – Saim 2010-08-16 11:30:53
创建一个小扩展似乎过度使用,过滤之前就足够了,因为后者可以选择应用哪些路由。您也可以通过request.path_info从过滤器的主体中知道。 – Robert 2015-05-13 09:13:29