我正在设计一个web api.我需要让用户自己进行身份验证.我有点怀疑让用户以明文形式传递他们的用户名/密码..例如:api.mysite.com/auth.php?user = x&pass = y
我读到的另一个选项是Base64编码用户名/密码,然后发送HTTP请求.那么这是否意味着在服务器端;我会_GET ['user']和_GET ['password']然后以某种方式解码它们?
这是twitter的作用:http://apiwiki.twitter.com/REST+API+Documentation#Authentication?
我是Spring/JavaEE Web程序员,我开始研究未来Web应用程序的REST原理,但我无法弄清楚如何进行可用的登录.对于Web API来说,它是有意义的,但面向最终用户的Web应用程序呢?我已经研究过HTTP Basic/Digest Authentication,但这只会产生一个丑陋的对话框.有人有主意吗?
我正在考虑一个休息网络服务,确保发送给他的每个请求:
客户端使用id和基于密码的内容签名进行身份验证.
应该没有会话,所以服务器状态!服务器和客户端共享密钥(密码)
在考虑它并与一些非常好的人交谈之后,似乎没有任何休息服务可以做到这一点,就像它应该是我的用例一样简单.(HTTP摘要和OAuth可以在服务器状态下执行此操作并且非常繁琐)
所以我想象一个,我问你的伟大评论它应该如何设计(我将发布它OpenSource和希望它可以帮助其他人).
该服务使用自定义"Content-signature"标头来存储凭据.经过身份验证的请求应包含此标头:
Content-signature: <METHOD>-<USERID>-<SIGNATURE>
<METHOD> is the sign method used, in our case SRAS.
<USERID> stands for the user ID mentioned earlier.
<SIGNATURE> = SHA2(SHA2(<PASSWORD>):SHA2(<REQUEST_HASH>));
<REQUEST_HASH> = <HTTP_METHOD>\n
<HTTP_URI>\n
<REQUEST_DATE>\n
<BODY_CONTENT>;
Run Code Online (Sandbox Code Playgroud)
创建请求10分钟后,请求将失效.
例如,典型的HTTP REQUEST将是:
POST /ressource HTTP/1.1
Host: www.elphia.fr
Date: Sun, 06 Nov 1994 08:49:37 GMT
Content-signature: SRAS-62ABCD651FD52614BC42FD-760FA9826BC654BC42FD
{ test: "yes" }
Run Code Online (Sandbox Code Playgroud)
服务器将回答:
401 Unauthorized
Run Code Online (Sandbox Code Playgroud)
要么
200 OK
Run Code Online (Sandbox Code Playgroud)
变量将是:
<USERID> = 62ABCD651FD52614BC42FD
<REQUEST_HASH> = POST\n
/ressource\n
Sun, 06 Nov 1994 08:49:37 GMT\n
{ …Run Code Online (Sandbox Code Playgroud) rest web-services restful-authentication http stateless-session
如果我的问题似乎重复,我很抱歉,但我还没有找到答案.
我正在使用Spring 3.0构建基于REST的应用程序,并计划最终部署到Google App Engine.现在我的客户可能是原生Android,iPhone或基于Web的客户端.
我的用户需要使用存储在持久层内的服务器中的用户名和密码进行登录.现在说我的Android客户端打开应用程序,并显示登录屏幕是用户.现在用户输入用户名和密码.
我知道这将是一个帖子,并说我的服务端点是注册.所以它会是这样的
POST /注册
现在我计划将用户名和密码放在Json或XML格式的消息正文中.我的问题是"这是正确的方法吗?" 我打算把它变成SSL,但我该如何真正发送这样的敏感信息呢.我计划在成功进行身份验证时返回OAUth令牌,并使用该令牌在将来的所有服务调用中验证用户.
提前致谢.
关于验证RESTful API的不同解决方案,我看过很多不同的帖子,鉴于目前的情况,我有一些问题.
我已经构建了一个REST API,允许我的软件服务的客户(我们是一家B2B公司)以编程方式访问资源.既然我已经使API正常运行,我想以最标准化的方式保护它.我需要允许基于API的调用者访问某些资源.也就是说,并非API的所有用户都可以访问所有资源.
我有以下格式的URLS:
https://mydomain/api/students
https://mydomain/api/students/s123
https://mydomain/api/students/s123/classes
https://mydomain/api/students/s123/classes/c456
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经提出了这些可能的解决方案:
为每个客户端提供唯一的密钥,以便最终生成加密令牌,该令牌将在每次REST调用结束时作为GET参数传递给(重新) - 验证每个请求.这种方法太贵了吗?
如被看见在HTTP认证头提供一个值这里.这跟#1几乎一样吗?(除非我无法将URL粘贴到浏览器中)人们是否再次使用这些标题?
使用OAuth 2(我还有点不清楚).OAuth 2实际上是以登录用户身份验证客户端吗?这不违反REST API无状态的精神吗?我希望OAuth对我来说是合适的解决方案(因为它是一个公共标准),但在阅读了一点之后,我不太确定.REST API调用是否过度和/或不正确?
我的目标是为每个想要使用API的客户提供一个不必更改的API,而是我可以为所有客户提供可用的标准文档.
如果我不清楚,我会很乐意发布更多细节.
我开发了一个简单的应用程序,该应用程序至少不使用任何第三方授权。我想创建一个可供iOS / Android /任何客户端使用的RESTful API,因此,我阅读了许多有关RESTful API实现的信息。但是,实现它们的通常方法包括发送某种用于签名请求的安全“令牌”。这使该API容易受到中间人攻击,建议使用HTTPS来解决该问题。
但是,阅读所有这些使我感到奇怪,为什么不为此使用私钥/公钥签名(如RSA)。这样,客户端将根据密码生成私钥和公钥,发送注册时的公钥并将私钥保留在客户端上,即使有人掌握了服务器和客户端之间的所有通信,他仍然不会不能冒充客户。
但是我对密码学和安全性几乎一无所知,所以一定有原因导致我没想到没有使用这种方法,对吗?
我理解CSRF令牌保护的目的.
但是,我认为这种保护是无用的,我们应该在REST API的情况下删除它,在每个操作的标头中都需要一个身份验证令牌.
这样,即使Mallory伪造了与Alice的恶意HTML链接,也无法进行攻击.原因是:
Alice将她的身份验证信息保存在Mallory不知道的标题密钥中.与cookie不同,Alice的浏览器不会自动提交此身份验证令牌.
因此,在这种情况下,我想让您对这个问题有所了解:我们可以从这种API设计中删除CSRF令牌保护吗?
authentication rest restful-authentication csrf http-headers
我正在Spring安全性中实现一个自定义身份验证提供程序来验证用户.身份验证服务器位于远程端(Restful service).我每次打电话给我的服务时都会遇到这个错误(这段代码到达了
return new UsernamePasswordAuthenticationToken(userDetails, authentication.getCredentials().toString(), grantedAuthorities);
部分)
{"error":"invalid_client","error_description":"Bad client credentials"}
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(HttpClients.createDefault());
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(60 * 1000)
.setSocketTimeout(60 * 1000).build();
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
poolingHttpClientConnectionManager.setMaxTotal(20);
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(20);
CloseableHttpClient httpClientBuilder = HttpClientBuilder.create()
.setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig)
.build();
requestFactory.setHttpClient(httpClientBuilder);
RestTemplate restTemplate = new RestTemplate(requestFactory);
UserInfoRequestBean userInfoRequestBean = new UserInfoRequestBean();
String username = (String)authentication.getPrincipal();
userInfoRequestBean.setUsername(username);
userInfoRequestBean.setPassword((String)authentication.getCredentials());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<?> httpEntity = …Run Code Online (Sandbox Code Playgroud) java authentication spring restful-authentication spring-security
我计划在一台Linux服务器上编写一个用Java编码的工作,该服务器计划每天使用REST API将文件上传到SharePoint本地2013.如何验证此客户端作业?我用谷歌搜索,但我仍在努力清楚地了解我的选择.
authentication rest sharepoint restful-authentication sharepoint-2013
我试图将Spring安全性与自定义角度2登录集成,这是我的应用程序的特定端点受弹簧安全保护,尝试访问它将重定向到/登录,在角度2处理.现在的情况我没有了解如何执行登录并在登录后授予对后端API的访问权限.
我正在配置弹簧安全性如下:
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.csrf().disable()
.cors().and()
.authorizeRequests()
.antMatchers("/api/someEndpoint/**")
.hasRole(ADMIN_ROLE).and().formLogin()
.loginPage("/login").and().logout();
}
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
Run Code Online (Sandbox Code Playgroud)
因为我有默认登录一切正常,但我发现自己无法创建一个有效的角度2登录集成.我在角度2中尝试了以下代码无效:
login(loginDetails:Object) {
console.log(loginDetails)
const headers = new Headers({ 'Content-Type': 'application/json' });
const options = new RequestOptions({ headers: headers });
const body = JSON.stringify(loginDetails);
console.log(headers);
console.log(body);
return this.http.post(this.loginUrl, body, options)
}
Run Code Online (Sandbox Code Playgroud)
据我所知,用户名和密码变量名称的弹簧安全默认值是"用户名"和"密码",我肯定会在请求体中传递,所以当传递一些无效的用户数据时,{"username":"admin", "password" : "pass"}我应该重定向到/ login?错误或其他什么,并且成功通过身份验证后,我应该重定向到/ welcome并保持身份验证
我有我的数据库中定义的用户和传递,我的自定义userDetailsService检查它是否欢迎任何答案,评论或问题
rest restful-authentication spring-mvc spring-security angular
rest ×7
spring ×3
java ×2
android ×1
angular ×1
api ×1
csrf ×1
http ×1
http-headers ×1
rsa ×1
sharepoint ×1
signing ×1
spring-mvc ×1
web-services ×1