我需要了解如何验证REST客户端(可能是Paw,可能是一个Android应用程序,使用AFNetworking和jHipster的iOs应用程序,我想,更一般来说,我不是专家的spring-boot)
虽然我在登录浏览器时能够获取令牌,并且随后在以下请求中使用此令牌,但我不知道如何使用RESTful最佳实践进行身份验证。
例如,在Paw.app中,我可以传递基本身份验证或Oauth2,但我不明白如何让会话令牌像在Web浏览器上那样进行身份验证。
同样,在AFNetworking中,我能够通过基本身份验证,例如
NSString*auth=[NSString stringWithFormat:@"%@:%@", @"admin", @"admin"];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", [auth base64EncodedString]];
[manager.requestSerializer setValue:authValue forHTTPHeaderField:@"Authorization"];
但我很难理解如何使用jHipster / spring boot中捆绑的会话安全性进行身份验证。
答案 0 :(得分:3)
首先,不要对移动应用程序使用HTTP会话身份验证。
另一方面,Oauth2或JWT适用于移动应用程序。它们背后的基本思想是从Jhipster获得令牌到移动令牌有一个到期时间。在那段时间内,您可以使用令牌访问Jhipster的任何REST API来访问数据。
下面我将展示我在基于angularjs的离子应用中如何使用Jhipster rest API的代码片段。我希望它能说明你需要做什么。
在 jhipster
中取消注释application.yml中的corscors: #By default CORS are not enabled. Uncomment to enable.
allowed-origins: "*"
allowed-methods: GET, PUT, POST, DELETE, OPTIONS
allowed-headers: "*"
exposed-headers:
allow-credentials: true
max-age: 1800
要在离子中使用Oauth2身份验证访问REST API,您必须首先通过离子应用程序获取令牌
$http({
method: "post",
url: "http://192.168.0.4:8085/[Your app name]/oauth/token",
data: "username=admin&password=admin&grant_type=password&scope=read write&client_secret=my-secret-token-to-change-in-production&client_id=auth2Sconnectapp",
withCredentials: true,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
'Authorization': 'Basic ' + 'YXV0aDJTY29ubmVjdGFwcDpteS1zZWNyZXQtdG9rZW4tdG8tY2hhbmdlLWluLXByb2R1Y3Rpb24='
}
})
.success(function(data) {
alert("success: " + data);
})
.error(function(data, status) {
alert("ERROR: " + data);
});
此处"YXV0aDJTY29ubmVjdGFwcDpteS1zZWNyZXQtdG9rZW4tdG8tY2hhbmdlLWluLXByb2R1Y3Rpb24=" is equal to (clientId + ":" + clientSecret)--all base64-encoded
如果成功,上面的$ http会给你这个包含令牌及其到期时间的JSON
{
"access_token": "2ce14f67-e91b-411e-89fa-8169e11a1c04",
"token_type": "bearer",
"refresh_token": "37baee3c-f4fe-4340-8997-8d7849821d00",
"expires_in": 525,
"scope": "read write"
}
如果您想访问任何API,请注意“access_token”和“token_type”,这是您必须使用的。我们发送带有API的令牌来访问数据,直到令牌过期,然后我们刷新它或访问新的。
例如
$http({
method: "get",
url: "http://192.168.0.4:8085/auth-2-sconnect/api/countries",
withCredentials: true,
headers: {
'Authorization':' [token_type] + [space] + [access_token] '
}
})
.success(function(data) {
alert("success: " + data);
})
.error(function(data, status) {
alert("ERROR: " + data);
});
答案 1 :(得分:2)
这里总结了我如何实施解决方案。这是真正的快速代码,但请将其视为伪代码,因为它可能不正确。
调用你需要调用的任何方法,为这个方法传递一个成功的回调(块或等价物)和一个用于失败的方法
func action(
URLString:String,
method:Method,
encoding:Encoding = .JSON,
parameters:[String : AnyObject]?,
success:(statusCode:Int, responseObject:AnyObject)->Void,
failure:(statusCode:Int, error:NSError)->Void
)
方法内部。 /events
您处理特定的失败案例,即状态代码为401时。
if(r!.statusCode==ResponseCodes.HTTP_UNAUTHORIZED.rawValue){
loginAndAction(URLString, method: method, encoding: encoding, parameters: parameters, success: success, failure: failure)
}else{
failure(statusCode: response.response!.statusCode, error:response.result.error!)
}
在这种特殊情况下,您不必返回结果并调用失败回调,而是调用login()方法,该方法在必要参数之后接受原始success()
回调
func loginAndAction(
URLString:String,
method:Method,
encoding: Encoding,
parameters:[String:AnyObject]?,
success:(statusCode:Int, responseObject:AnyObject)->Void,
failure:(statusCode:Int, error:NSError)->Void
)->Void
如果验证成功
var d:[String:AnyObject] = response.result.value as! [String:AnyObject]
self.authToken = d["access_token"] as! String
action(URLString, method: method,encoding:encoding, parameters: parameters, success: success, failure: failure)
此时方法操作可以使用正确的工作令牌。
这应该每天只发生一次(基于令牌过期),并且它是适用于oauth2 refresh_token
呼叫的机制。