Jhipster + REST клиент + аутентификация
Мне нужно понять, как аутентифицировать клиент REST (может быть Paw, может быть android-приложение, приложение iOs, использующее AFNetworking с jHipster, и я думаю, в целом, с spring-boot, в котором я не эксперт).
хотя я могу получить токен при входе в браузер и впоследствии использовать этот токен в следующих запросах, я не понимаю, как я могу аутентифицировать в первую очередь, используя рекомендации RESTful.
например, в Paw.app, I может пройти базовую аутентификацию или Oauth2, но я не понимаю, как получить маркер сеанса просто аутентификацию, как я делаю в веб-браузере.
аналогично, в AFNetworking я могу пройти базовую аутентификацию, например
NSString*auth=[NSString stringWithFormat:@"%@:%@", @"admin", @"admin"];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", [auth base64EncodedString]];
[manager.requestSerializer setValue:authValue forHTTPHeaderField:@"Authorization"];
но я изо всех сил пытаюсь понять, как аутентифицироваться с помощью безопасности сеанса, которая входит в комплект jhipster/spring boot.
2 ответов
прежде всего, не используйте аутентификацию сеанса HTTP для мобильных приложений.
С другой стороны, Oauth2 или JWT отлично работают с мобильными приложениями. Основная идея заключается в том, чтобы получить маркер от Jhipster до mobile токен имеет срок действия. За это время вы можете использовать токен для доступа к любому API REST Jhipster для доступа к данным.
ниже я показываю фрагмент кода того, как я использовал API rest JHIPSTER в моем ионном приложении на основе angularjs. Я надеюсь на это. дает представление о том, что нужно делать.
раскомментировать cors в приложении.yml внутри jhipster
cors: #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
чтобы получить доступ к REST API с аутентификацией Oauth2 в ionic, вы должны сначала получить токен в ionic app по
$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"
}
обратите внимание на "access_token" и "token_type", если вы хотите доступ к любому API это то, что вы должны использовать. Мы отправляем токен с 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);
});
вот краткое изложение того, как я реализовал решение. Это настоящий swift-код, но, пожалуйста, примите его как псевдокод, так как он может быть неправильным.
-
вызовите любой метод, который вам нужно вызвать, передав в таком методе обратный вызов (блок или эквивалент) для успеха и один для отказа
func action( URLString:String, method:Method, encoding:Encoding = .JSON, parameters:[String : AnyObject]?, success:(statusCode:Int, responseObject:AnyObject)->Void, failure:(statusCode:Int, error:NSError)->Void )
-
внутри метода es.
/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
звонок.