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-код, но, пожалуйста, примите его как псевдокод, так как он может быть неправильным.

  1. вызовите любой метод, который вам нужно вызвать, передав в таком методе обратный вызов (блок или эквивалент) для успеха и один для отказа

    func action(
        URLString:String,
        method:Method,
        encoding:Encoding = .JSON,
        parameters:[String : AnyObject]?,
        success:(statusCode:Int, responseObject:AnyObject)->Void,
        failure:(statusCode:Int, error:NSError)->Void
    )
    
  2. внутри метода 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!)
    
     }
    
  3. в этом конкретном случае вместо возврата результата и вызова обратного вызова сбоя вы вызываете метод 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
    
  4. если аутентификация прошла успешно

    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 звонок.