java实现oauth2.0_Java的oauth2.0 服务端与客户端的实现

本文介绍了Java环境下实现OAuth2.0协议的详细步骤,包括客户端如何请求授权码、服务端如何返回授权码、客户端如何获取访问令牌、服务端如何验证并生成访问令牌,以及客户端如何使用访问令牌获取资源。通过Apache Oltu库,展示了从构造OAuth请求到交互过程的完整代码示例。
摘要由CSDN通过智能技术生成

oauth原理简述

oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装。我们做Java web项目想要实现oauth协议进行资源授权访问,直接使用该封装就可以。

oauth2.0 的协议实现原理,所有的技术层面的开发都是围绕这张图。

981ea51d3e6d592b1c3f900405dd0bf5.png

整个开发流程简述一下:

1、  在客户端web项目中构造一个oauth的客户端请求对象(OAuthClientRequest),在此对象中携带客户端信息(clientId、accessTokenUrl、response_type、redirectUrl),将此信息放入http请求中,重定向到服务端。此步骤对应上图1

2、 在服务端web项目中接受第一步传过来的request,从中获取客户端信息,可以自行验证信息的可靠性。同时构造一个oauth的code授权许可对象(OAuthAuthorizationResponseBuilder),并在其中设置授权码code,将此对象传回客户端。此步骤对应上图2

3、 在在客户端web项目中接受第二步的请求request,从中获得code。同时构造一个oauth的客户端请求对象(OAuthClientRequest),此次在此对象中不仅要携带客户端信息(clientId、accessTokenUrl、clientSecret、GrantType、redirectUrl),还要携带接受到的code。再构造一个客户端请求工具对象(oAuthClient),这个工具封装了httpclient,用此对象将这些信息以post(一定要设置成post)的方式请求到服务端,目的是为了让服务端返回资源访问令牌。此步骤对应上图3。(另外oAuthClient请求服务端以后,会自行接受服务端的响应信息。

4、 在服务端web项目中接受第三步传过来的request,从中获取客户端信息和code,并自行验证。再按照自己项目的要求生成访问令牌(accesstoken),同时构造一个oauth响应对象(OAuthASResponse),携带生成的访问指令(accesstoken),返回给第三步中客户端的oAuthClient。oAuthClient接受响应之后获取accesstoken,此步骤对应上图4

5、 此时客户端web项目中已经有了从服务端返回过来的accesstoken,那么在客户端构造一个服务端资源请求对象(OAuthBearerClientRequest),在此对象中设置服务端资源请求URI,并携带上accesstoken。再构造一个客户端请求工具对象(oAuthClient),用此对象去服务端靠accesstoken换取资源。此步骤对应上图5

6、 在服务端web项目中接受第五步传过来的request,从中获取accesstoken并自行验证。之后就可以将客户端请求的资源返回给客户端了。

代码:

客户端:

一、pom依赖:

org.apache.oltu.oauth2

org.apache.oltu.oauth2.client

0.31

二、controller方法:

2.1 向服务端请求授权码code的controller方法:

@RequestMapping("/server")

@Controller

public class ServerController{

String clientId = null;

String clientSecret = null;

String accessTokenUrl = null;

String userInfoUrl = null;

String redirectUrl = null;

String response_type = null;

String code= null;

//提交申请code的请求

@RequestMapping("/requestServerCode")

public String requestServerFirst(HttpServletRequestrequest, HttpServletResponseresponse, RedirectAttributesattr) throwsOAuthProblemException{

clientId = "clientId";

clientSecret = "clientSecret";

accessTokenUrl = "responseCode";

redirectUrl = "http://localhost:8081/oauthclient01/server/callbackCode";

response_type = "code";

OAuthClient oAuthClient =new OAuthClient(new URLConnectionClient());

String requestUrl = null;

try {

//构建oauthd的请求。设置请求服务地址(accessTokenUrl)、clientId、response_type、redirectUrl

OAuthClientRequest accessTokenRequest = OAuthClientRequest

.authorizationLocation(accessTokenUrl)

.setResponseType(response_type)

.setClientId(clientId)

.setRedirectURI(redirectUrl)

.buildQueryMessage();

requestUrl = accessTokenRequest.getLocationUri();

System.out.println(requestUrl);

} catch (OAuthSystemExceptione) {

e.printSt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值