2017-04-24 55 views
0

我创建了一个OAUTH2授权服务器,它使用客户端凭证进行身份验证,并负责发布JWT令牌。当我使用邮递员发出请求时,我按预期得到了JWT令牌,但是当我以角度放置请求时,收到错误消息:“unsupported_grant_type”。如何在角度http请求中实现client_credentials授予类型?

下面是授权服务器相关的代码:

Startup.cs

public void Configuration(IAppBuilder app) 
     {  
      // HTTP Configuration 
      HttpConfiguration config = new HttpConfiguration(); 
      config.MapHttpAttributeRoutes(); 
      ConfigureOAuth(app); 
      app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
      app.UseWebApi(config); 
     } 

private void ConfigureOAuth(IAppBuilder app) 
{ 
    OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
    { 
     //For Dev enviroment only (on production should be AllowInsecureHttp = false) 
     AllowInsecureHttp = true, 
     TokenEndpointPath = new PathString("/oauth2/token"), 
     AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30), 
     Provider = new CustomOAuthProvider(ActiveKernel), 
     AccessTokenFormat = new CustomJwtFormat("http://localhost:62790", ActiveKernel) 
    }; 

    // OAuth 2.0 Bearer Access Token Generation 
    app.UseOAuthAuthorizationServer(OAuthServerOptions); 
} 

CustomOAuthProvider.cs

​​

当我把使用授权类型的OAuth2到http://localhost:55555/oauth2/Token的请求在邮差中,我返回了一个有效的JWT令牌,我可以将其添加到我的请求中:

Postman Request

但是,当我尝试使用角度获取访问令牌时,我收到一条错误消息,指示:“unsupported_grant_type”。我期望的grant_type是client_credentials。我已经尝试了多种角度的方法来使这个工作没有运气。这里是角当前请求:

function getLoginToken() { 

     var auth = btoa("89C30F1E-DEE3-4C67-8P2E-9C974R5A35EA:B9wXE8Vo+FEkm2AnqFZlS+KJiwYc+bSnarpq90lGyBo="); 

     var loginToken = $http({ 
      url: 'http://localhost:55555/oauth2/Token', 
      method: "POST", 
      data: { 
       grant_type: 'client_credentials' 
      }, 
      withCredentials: true, 
      headers: { 
       "Authorization": "Basic " + auth, 
'Content-Type': 'application/x-www-form-urlencoded' 
      } 
     }).then(function(data) { 
      return data; 
     }).catch(function (errorResponse) { 
      throw errorResponse; 
     }); 
     return loginToken; 
    }; 

我已经尝试添加“的Content-Type”:“应用程序/ X WWW的形式,进行了urlencoded”的头和加入grant_type到URL,但结果是一样的。如果我使用邮递员放置请求而不使用授权功能;但是使用Body'x-www-form-urlencoded',我会收到与角度相同的错误消息。

在angular和second postman的例子中,我实际上都在ValidateClientAuthentication方法的内部获取了正确的client_id和client_secret,并且验证了上下文。

这里有两个请求的提琴手图片:

从角

破碎要求: Broken angular request

工作邮递员要求: Working Postman Request

什么可这里怎么回事不对任何建议我可能能够解决这个问题?

在此先感谢!

回答

0

我已通过添加下面的代码行解决了这个问题:

$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8"; 
      var payload = $.param({ grant_type: 'client_credentials' }); 

的grant_type现在来通过诸如键和“client_credentials”是值。整个请求看起来像这样:

function getLoginToken() { 

$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8"; 
      var payload = $.param({ grant_type: 'client_credentials' }); 

     var auth = btoa("89C30F1E-DEE3-4C67-8P2E-9C974R5A35EA:B9wXE8Vo+FEkm2AnqFZlS+KJiwYc+bSnarpq90lGyBo="); 

     var loginToken = $http({ 
      url: 'http://localhost:55555/oauth2/Token', 
      method: "POST", 
      data: payload, 
      withCredentials: true, 
      headers: { 
       "Authorization": "Basic " + auth, 
'Content-Type': 'application/x-www-form-urlencoded' 
      } 
     }).then(function(data) { 
      return data; 
     }).catch(function (errorResponse) { 
      throw errorResponse; 
     }); 
     return loginToken; 
    }; 

我希望这可以帮助有人下线!

0

为了更加清晰的原始请求最小必须是:

内容类型:应用/ X WWW的窗体-urlencoded

grant_type =密码&用户名= USERNAME &密码= PASSWORD