标签: restful-authentication

使用自定义令牌保护REST API(无状态,无UI,无cookie,无基本身份验证,无OAuth,无登录页面)

有很多指南,示例代码显示如何使用Spring Security保护REST API,但大多数都假设一个Web客户端并谈论登录页面,重定向,使用cookie等.甚至可能是一个简单的过滤器,检查HTTP标头中的自定义标记可能就足够了.如何实现以下要求的安全性?有没有任何gist/github项目做同样的事情?我对弹簧安全的了解有限,所以如果有更简单的方法来实现弹簧安全性,请告诉我.

  • REST API由无状态后端通过HTTPS提供服务
  • 客户端可以是网络应用程序,移动应用程序,任何SPA风格的应用程序,第三方API
  • 没有基本身份验证,没有cookie,没有UI(没有JSP/HTML /静态资源),没有重定向,没有OAuth提供者.
  • HTTPS标头上设置的自定义标记
  • 针对外部存储完成的令牌验证(如MemCached/Redis /甚至任何RDBMS)
  • 除了选定的路径(如/ login,/ signup,/ public等)之外,所有API都需要进行身份验证.

我使用Springboot,spring security等.更喜欢使用Java配置的解决方案(没有XML)

rest restful-authentication spring-security stateless spring-boot

37
推荐指数
2
解决办法
3万
查看次数

使用RESTful WCF和Windows窗体进行用户/通过身份验证

对于与IIS托管的RESTful WCF服务进行通信的Windows窗体应用程序,实现授权/身份验证的最佳方法是什么?

我问的原因是我非常困惑,在筛选出不同的文章和帖子后表达了不同的方法并最终在WCF安全最佳实践中找到了约650页的文档"(http://www.codeplex.com/WCFSecurityGuide)我是根据我的情况,我不确定哪种方法最好采取以及如何开始实施.

我从这篇文章"使用WCF 3.5设计和构建RESTful Web服务指南"(http://msdn.microsoft.com/en-us/library/dd203052.aspx)和RESTful WCF服务的PDC视频开始很棒,帮助我实现了我的第一个REST友好的WCF服务,

在我使用该服务后,我返回实施安全性,请参阅."安全注意事项"(页面下方四分之一)并尝试按照说明实现HTTP Authorization标头,但是我发现代码不完整(请参阅"UserKeys"变量从未声明的方式).这是我试图研究如何做到这一点的更多点(使用带有"授权"HTTP标头的HMAC哈希,但在谷歌上找不到多少?)它引导我阅读有关消息级安全性的其他文章,形成auth和自定义验证器,坦率地说,我不确定哪种方法最好,最合适.

所以说了这些(感谢听到现在!),我想我的主要问题是,

- 我应该使用哪种安全实施方案?

- 有没有办法避免每次WCF呼叫都发送用户名/密码?如果在开始时建立了连接,我宁愿不发送这些额外的字节,这将是在登录后允许进行后续调用之前.

- 如果我使用SSL,我是否真的应该关注除纯文本以外的任何内容?

如上所述,.NET 3.5 win表单应用程序,IIS托管的WCF服务,但重要的是我希望任何和所有WCF服务都需要此授权程序(但它应该是,session,http header或其他),因为我不希望任何人能够从网上获得这些服务.

我知道上面的帖子很大但是我必须表达我已经失败的路线以及我需要完成的任务,我们非常感谢所有的帮助.

PS:我也知道这篇文章如何使用用户名/密码+ SSL配置WCF的安全REST服务,如果社区建议我从REST转移到WCF服务,我可以这样做,但是我开始这样做以保持一致性任何公共API来.

我认为重要的是我说明了我如何访问我的WCF服务(联系服务正在运行,但验证凭据的最佳方法是什么 - 然后返回Member对象?):

WebChannelFactory<IMemberService> cf = new WebChannelFactory<IMemberService>(
                new Uri(Properties.Settings.Default.MemberServiceEndpoint));
            IMemberService channel = cf.CreateChannel();
            Member m = channel.GetMember("user", "pass");
Run Code Online (Sandbox Code Playgroud)

代码是MS文章中的一半(以及我自己的一些用于测试):

 public Member GetMember(string username, string password)
    {
        if (string.IsNullOrEmpty(username))
            throw new WebProtocolException(HttpStatusCode.BadRequest, "Username must be provided.", null);
        if (string.IsNullOrEmpty(password))
            throw new WebProtocolException(HttpStatusCode.BadRequest, "Password must be provided.", null);

        if (!AuthenticateMember(username))
        {
            WebOperationContext.Current.OutgoingResponse.StatusCode …
Run Code Online (Sandbox Code Playgroud)

.net wcf ws-security restful-authentication

36
推荐指数
2
解决办法
2万
查看次数

ASP.net Web API RESTful Web服务+基本身份验证

我正在使用ASP.Net Web Api实现RESTful Web服务.我已经得出结论,使用基本身份验证+ SSL来执行身份验证部分.实现它的最佳/正确方法是什么?

我的第一次尝试是手动执行,解析Authorization标头,根据我的数据库解码和验证用户.它有效,但我想知道我是否遗漏了一些东西.

我见过一些使用用户角色和主体的解决方案.虽然我不确定这些实际上做了什么,但我几乎肯定我不需要这些,因为在我的数据库中我定义了自己的用户和他们的角色.

我还没有完全理解的是,服务的消费者是否必须在每个请求中发送凭据,或者以某种方式缓存它们.我的服务是否应该为了实现这一点而做某事,或者完全取决于消费者来处理这个问题?

关于客户端使用javascript发出请求的最后一个问题.如果他们尝试使用该服务,是否会出现"跨域请求"问题?

restful-authentication basic-authentication asp.net-web-api

34
推荐指数
2
解决办法
7万
查看次数

安全的RESTful API,可供Web App(角度),iOS和Android使用

我必须制定一个计划来开发一个RESTful API(Python/Flask),可以被我们未来的Web应用程序(Angularjs)和移动应用程序(iOS/Android)使用.

我已经研究了三天,并且遇到了几种情况:使用HTTPS是下面方法的一种方法,以保证它更安全.但https速度较慢,这可能意味着我们需要更快,更昂贵的服务器.

  1. 对于API的每个请求,使用Basic-Http-Auth并通过线路以普通(但https)发送用户名/密码.
  2. 使用Digest-Auth,它是密码的哈希值,跟踪将是自动的.这适用于Web应用程序,但是我无法确认iPhone和Android是否会本机支持.如果他们这样做,这可能是一个简单的解决方案!
  3. 使用自定义http标头,我会在成功验证后在http标头中发送自定义Auth字符串.但是我必须确保我为用户发出的每个请求发送此身份验证代码.这使得它与1)完全相同,不同之处在于未使用普通密码,并且授权代码可以在没有任何风险的情况下过期.同样有问题的是跟踪授权代码,该代码不再像2)中那样自动化
  4. 使用OAuth是一种选择.但它很难建立起来.如果没有更好的方法,也许这是唯一的方法?
  5. 如本篇文章所述,像Amazon S3一样保护API .简而言之,他说服务器和客户端都知道私钥,他们会用它来散列通信.这就像强盗握手,如果他知道帮派握手,你只会信任送货员.有人问道:

如何在纯HTML5应用程序中保持私钥"安全"?

你完全正确; 在纯HTML5(JS/CSS/HTML)应用程序中,没有保护密钥.您可以通过HTTPS进行所有通信,在这种情况下您不需要密钥,因为您可以使用标准API_KEY或其他友好标识符安全地识别客户端,而无需HMAC的需要或复杂性.

换句话说,首先在Web应用程序中使用该方法甚至没有意义.老实说,我不明白这应该如何在移动设备上运行.用户下载我们的应用程序,如何将私钥从iphone发送到服务器?我转移它的那一刻,它将受到损害.

我越是研究我越是优柔寡断.

我希望能问一些以前做过这个并且可以分享经验的专业人士.非常感谢

iphone android restful-authentication oauth flask

33
推荐指数
1
解决办法
1万
查看次数

如何保护CouchDB

作为休息服务的CouchDB访问似乎不安全.任何人都可以访问数据库并在文档暴露后删除/添加文档.

保护CouchDB有哪些策略?

security couchdb restful-authentication

31
推荐指数
4
解决办法
2万
查看次数

基于NodeJS的HTTP客户端:如何验证请求?

这是我要做一个简单的GET请求的代码:

var options = {
    host: 'localhost',
    port: 8000,
    path: '/restricted'
};

request = http.get(options, function(res){
    var body = "";
    res.on('data', function(data) {
        body += data;
    });
    res.on('end', function() {
        console.log(body);
    })
    res.on('error', function(e) {
        console.log("Got error: " + e.message);
    });
});
Run Code Online (Sandbox Code Playgroud)

但是该路径"/ restricted"需要简单的基本HTTP身份验证.如何添加凭据进行身份验证?我在NodeJS手册中找不到与基本http认证相关的任何内容.提前致谢.

authentication restful-authentication http basic-authentication node.js

29
推荐指数
2
解决办法
2万
查看次数

在OAuth2隐式授权中处理过期的访问令牌

OAuth2的规范规定授权服务器在使用隐式授权时不得发出刷新令牌.在我们的用例中,我们使用OAuth2保护RESTful API,并使用单页Javascript应用程序作为此API的客户端.由于在访问令牌过期后重定向到授权服务器非常困难,我们正在寻找更好的方法来获取新的有效令牌.我可以考虑两种不同的方法,并想知道哪一种可能更好:

  1. 使用隐藏的iframe重新请求有效的访问令牌.为此,必须包含一个参数,例如"prompt = none",它告诉OAuth提供者既不挑战认证,也不显示授权页面.如果用户已通过身份验证并已授权应用程序,则服务器将在URL#parameters中发回访问令牌.如果未满足上述条件之一,它将重定向,并出现错误,如#error = authentication%20lost.通过这种行为,我们可以使用具有隐式流的短期访问令牌.

  2. 我们可以使用一个额外的范围(例如离线)来告诉服务器分发刷新令牌.即使原始规范说隐式流不会发出刷新令牌(如果客户端仅将OAuth用于第一次授权,这是正确的),您可以自由地为您的特定应用程序定义自己的作用域.您应该考虑仅允许来自知名客户端的此范围.

这两种方法都与OpenID Connect非常相似.不幸的是,目前OpenID Connect的实现并不多.因此,第一步是扩展OAuth2服务器,直到OIC更受欢迎.

那么哪种方法应该首选?

编辑:令牌端点需要客户端身份验证,这仅适用于机密客户端,如服务器端应用程序.使用第二种方法,只有在我们的情况下,RESTful API才能使资源提供者刷新令牌并将其发送回客户端.我认为这会带来安全风险.所以我们可能只有一种有效的方法.

restful-authentication single-sign-on oauth-2.0 single-page-application

29
推荐指数
1
解决办法
7984
查看次数

如何为REST后端/ Ajax前端应用程序设计身份验证和授权系统

我正在开始一个新的项目,我们计划构建一个宁静的后端和一个AJAX字体结束.我正在通过专注于识别我拥有的所有资源以及各种HTTP动词将执行它们,它们的URI以及这些资源的JSON表示来解决问题.

我正在寻找最好的设计来保护后端.这是我考虑过的设计清单.我正在寻找下面未列出的替代设计,以及优点,缺点建议.该系统将使用Spring 3.0以及可能的Spring Security 3.0实现,SSL将用于系统的许多部分,但不适用于所有部分,因此一些请求可能来自SSL而一些可能不会.

选项1:使用HTTP会话

显示标准登录屏幕,创建服务器端会话并让tomcat发回jsessionid cookie并让ajax客户端在每个XHR请求中包含JSESSIONID cookie.由于以下原因,这种选择感觉就像是错误的方法.

  • 连接变为statefull,这违反了REST的规则
  • 我希望能够将bakcend分成多个单独的WAR文件,这意味着我可以在后端有多个HTTP会话,如果是这种情况,那么这种方法不起作用.虽然我今天不需要将后端分成多个应用程序的能力,但我更倾向于采用允许这种可能性的设计.

选项2:找到一个基于Java的开源安全库来实现这一目标

除了Spring安全性之外,我还没有找到任何其他Java库,任何建议都受到高度赞赏.

选项3:尝试使用OAuth等现有协议

在我简要介绍OAuth时,它似乎是为每个站点拥有自己的用户数据库的站点进行身份验证而设计的.在这个系统中,我希望在所有后端ajax服务中共享一个全局用户数据库.

选项4:使用SAML和Shiboleth

这个选项看起来过于苛刻,而且设置和维护非常复杂.

选项5:每次请求都会发送用户名和密码

这要求用户在每次请求时都会发送用户名和密码,这意味着前端AJAX应用必须将用户名和密码存储为JavaScript对象,如果用户离开页面然后返回用户名/密码组合将会消失并且用户可能被迫再次登录.我不希望前端尝试将用户名和密码放入cookie中,因为这将构成安全性.

选项6:实施我自己的身份验证/授权协议

创建一个REST服务,用户可以向其提供用户名/密码组合,然后返回安全令牌,他们必须在每次请求时将其发送回服务.安全令牌将由服务进行数字签名,并具有到期时间.该令牌仅对大多数操作有利,高安全性操作将需要新的登录屏幕作为确认操作的端口.

这种方法的问题是我必须发明另一种安全协议,这似乎是浪费时间.

我相信我不是唯一一个反对这个问题的人,我希望堆栈溢出社区可以指出一些我还没有找到的选项和工具.

ajax rest spring restful-authentication spring-security

26
推荐指数
1
解决办法
1万
查看次数

HTTP 401未授权或403禁止"禁用"用户?

身份验证服务允许禁用用户帐户(一种软删除).

如果服务器接收到禁用用户的身份验证请求,否则该服务器将返回401或403?使用任一状态代码,我将返回一条消息,指示该帐户已被禁用.

有关快速参考,HTTP/1.1规范的相关引用(强调我的):

401未经授权

该请求需要用户身份验证.响应必须包含WWW-Authenticate头字段(第14.47节),其中包含适用于所请求资源的质询.客户端可以使用合适的Authorization头字段重复请求(第14.8节).如果请求已包含授权凭据,则401响应表示已拒绝授权这些凭据.如果401响应包含与先前响应相同的挑战,并且用户代理已经尝试过至少一次认证,则应该向用户呈现响应中给出的实体,因为该实体可能包括相关的诊断信息.HTTP访问身份验证在"HTTP身份验证:基本和摘要访问身份验证"[43]中进行了说明.

403禁止

服务器理解请求,但拒绝履行请求. 授权无效,请求不应重复.如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因.如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到).

rest restful-authentication http

26
推荐指数
2
解决办法
6万
查看次数

休息 - 如何获取呼叫者的IP地址

我正在编写Java Rest Web服务并需要调用者的IP地址.我以为我曾经在cookie中看到过这个,但现在我没有看到它.是否有一致的地方获取此信息?

我看到了一个使用"OperationalContext"来获取它的例子,但这不是在java中.

java rest web-services restful-authentication jax-rs

25
推荐指数
3
解决办法
4万
查看次数