Oauth2和Spring-Security:使用Oauth2和spring-security进行身份验证失败

时间:2014-07-24 10:06:10

标签: exception spring-security oauth-2.0 basic-authentication

我想在休息网络服务中使用Oauth2和Spring-security。我是新手,我试图在一些网站的帮助下创建配置。尽管如此,我显然不明白oauth如何以及为休息服务验证的流程是什么。我正在使用最新的依赖项Click on the link for see my configurations。我正在使用数据库存储客户信息和令牌。当我尝试访问令牌时,使用带有帖子请求和帖子正文的follwoing网址:

http://localhost:8080/empirecl-api/oauth/token
grant_type=password&username=a@a.com&password=password&client_id=my-client-with-secret&client_secret=ak_secret

将出现基本身份验证弹出框。我正在使用镀铬休息邮差客户端。我的数据库中有用户表,我存储,用户名和密码,当我输入usernamepassword时,验证失败,如果我使用我的client_id和{{1} } client_secretusername,身份验证失败。当我取消password之后的基本身份验证时,返回:

json

我无法弄清楚会发生什么。

当我尝试使用get reqquest访问以下网址时:

{
"error": "unauthorized",
"error_description": "No client with requested id: a@a.com"
}

以下http://localhost:8080/empirecl-api/oauth/authorize?grant_type=password&username=a@a.com&password=password 将返回:

error

当我在eclipse的控制台中检查错误时,会显示以下错误:

{
"error": {
    "error": "invalid_client",
    "error_description": "Bad client credentials"
}
}

我如何解决这个问题以及如何将Oauth用于我的其他api。我也想用Oauth确保我所有的休息网址。

2 个答案:

答案 0 :(得分:3)

这里有一些问题。

  1. 您使用的是错误的端点 - 请求应该是令牌端点,而不是授权端点。
  2. 它应该是POST请求 - 您不应该传递URL中的参数
  3. 当用户需要进行身份验证以及客户端进行身份验证时,您会感到困惑 - 服务器正在从客户端查找基本凭据,但您输入的是用户名。
  4. 请参阅the oauth2 spec section on using the resource owner password grant

    client needs to authenticate和porterhead指出,您可以使用基本身份验证执行此操作。规范还允许将客户端ID和机密作为post参数传递,但更喜欢基本身份验证。

    您应该确保了解更多关于OAuth2的工作原理,并且可能会扩展您的问题以解释您为什么要使用它以及您选择此特定授权类型的原因。

答案 1 :(得分:1)

您需要将客户端用户名和密码作为Base64编码的授权标头传递。

尝试使用curl。这是一个例子:

curl -v -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Basic MzUzYjMwMmM0NDU3NGY1NjUwNDU2ODdlNTM0ZTdkNmE6Mjg2OTI0Njk3ZTYxNWE2NzJhNjQ2YTQ5MzU0NTY0NmM=" \
'http://localhost:8080/empirecl-api/oauth/token?grant_type=password&username=a@a.com&password=password'

我有一个描述here

的工作示例