OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)

授权方式3-密码模式(Resource Owner Password Credentials Grant)

密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。

在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

密码模式

它的步骤如下:

(A)用户向客户端提供用户名和密码。

(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。

(C)认证服务器确认无误后,向客户端提供访问令牌。

B步骤中,客户端发出的HTTP请求,包含以下参数:

  • grant_type:表示授权类型,此处的值固定为"password",必选项。
  • username:表示用户名,必选项。
  • password:表示用户的密码,必选项。
  • scope:表示权限范围,可选项。

下面是一个例子。


     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=password&username=johndoe&password=A3ddj3w

C步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。


     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"example", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", "example_parameter":"example_value" } 

整个过程中,客户端不得保存用户的密码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用 oauth2java 包进行密码校验的示例代码: ```java import com.nimbusds.oauth2.sdk.*; import com.nimbusds.oauth2.sdk.auth.ClientAuthentication; import com.nimbusds.oauth2.sdk.auth.ClientSecretBasic; import com.nimbusds.oauth2.sdk.auth.Secret; import com.nimbusds.oauth2.sdk.http.HTTPRequest; import com.nimbusds.oauth2.sdk.http.HTTPResponse; import com.nimbusds.oauth2.sdk.token.AccessToken; import com.nimbusds.oauth2.sdk.token.BearerAccessToken; import com.nimbusds.oauth2.sdk.token.Tokens; import java.net.URI; import java.util.HashMap; import java.util.Map; public class PasswordValidator { public boolean validate(String username, String password) { // 构建 access token 请求 URI tokenEndpoint = URI.create("https://example.com/token"); // token 端点 ClientID clientID = new ClientID("client_id"); // 客户端 ID Secret clientSecret = new Secret("client_secret"); // 客户端密钥 ClientAuthentication clientAuth = new ClientSecretBasic(clientID, clientSecret); // 客户端认证方式 Scope scope = Scope.parse("read write"); // 请求的范围 GrantType grantType = GrantType.PASSWORD; // 授权类型为密码模式 AuthorizationGrant authGrant = new ResourceOwnerPasswordCredentialsGrant(username, password); // 认证授权方式为用户名密码模式 TokenRequest request = new TokenRequest(tokenEndpoint, clientAuth, authGrant, scope); // 发送 access token 请求 HTTPRequest httpRequest = request.toHTTPRequest(); HTTPResponse httpResponse = httpRequest.send(); // 解析 access token 响应 TokenResponse response = TokenResponse.parse(httpResponse); if (response instanceof TokenErrorResponse) { return false; // 认证失败,返回 false } else { Tokens tokens = ((AccessTokenResponse)response).getTokens(); AccessToken accessToken = tokens.getAccessToken(); // 这里可以将 accessToken 存储到数据库中,供后续使用 return true; // 认证成功,返回 true } } public static void main(String[] args) { PasswordValidator validator = new PasswordValidator(); validator.validate("username", "password"); } } ``` 以上示例代码使用密码模式进行认证,将用户名和密码作为 ResourceOwnerPasswordCredentialsGrant 的构造参数,并通过 TokenRequest 发送 access token 请求。如果认证成功,可以从响应中获取 access token 并进行下一步操作。如果认证失败,可以根据具体情况进行错误处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值