Jhipster + REST客户端+身份验证

时间:2015-10-31 15:28:39

标签: rest security spring-boot jhipster

我需要了解如何验证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中捆绑的会话安全性进行身份验证。

2 个答案:

答案 0 :(得分:3)

首先,不要对移动应用程序使用HTTP会话身份验证。

另一方面,Oauth2或JWT适用于移动应用程序。它们背后的基本思想是从Jhipster获得令牌到移动令牌有一个到期时间。在那段时间内,您可以使用令牌访问Jhipster的任何REST API来访问数据。

下面我将展示我在基于angularjs的离子应用中如何使用Jhipster rest API的代码片段。我希望它能说明你需要做什么。

jhipster

中取消注释application.yml中的cors
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

要在离子中使用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)

这里总结了我如何实施解决方案。这是真正的快速代码,但请将其视为伪代码,因为它可能不正确。

  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. 方法内部。 /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)
    
  5. 此时方法操作可以使用正确的工作令牌。

    这应该每天只发生一次(基于令牌过期),并且它是适用于oauth2 refresh_token呼叫的机制。