OAthe2 Login use OkHttpClient and OAuth2RestTemplate
http://samchu.logdown.com/posts/1437422-oathe2-login-use-okhttpclient-and-oauth2resttemplate?utm_source=tuicool&utm_medium=referral
如果要取得 OAuth 授權的話,可以直接使用 OkHttpClient 或是 OAuth2RestTemplate 來實作
在依賴中增加 OkHttpClient
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.6.0'
}
實際登入的程式
public void Okhttp() throws IOException {
OkHttpClient client = new OkHttpClient();
String credential = Credentials.basic("clientkpi", "123456");
FormBody body = new FormBody.Builder()
.add("username", "sam.chu=")
.add("password", "12345678")
.add("grant_type", "password")
.add("scope", "account role").build();
Request request = new Request.Builder()
.header("Authorization", credential)
.url("http://localhost:8081/oauth/token")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
ObjectMapper mapper = new ObjectMapper();
OauthToken oauthToken = mapper.readValue(response.body().string(), OauthToken.class);
System.out.println(oauthToken);
}
}
或是你可以選 org.springframework.security.oauth:spring-security-oauth2 提供的 OAuth2RestTemplate
在依賴中增加 org.springframework.security.oauth:spring-security-oauth2
dependencies {
compile('org.springframework.boot:spring-boot-starter-security')
compile 'org.springframework.security.oauth:spring-security-oauth2:2.0.12.RELEASE'
}
public void testOAuth() {
AccessTokenRequest atr = new DefaultAccessTokenRequest();
OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(resource(), new DefaultOAuth2ClientContext(atr));
try {
System.out.println(oAuth2RestTemplate.getAccessToken());
System.out.println(oAuth2RestTemplate.getAccessToken().getRefreshToken());
} catch (OAuth2AccessDeniedException e) {
System.out.println("登入失敗" + e.getHttpErrorCode()); // 403
System.out.println("登入失敗" + e.getOAuth2ErrorCode()); // access_denied
System.out.println("登入失敗" + e.getMessage()); //Access token denied.
System.out.println("登入失敗" + e.getLocalizedMessage()); // Access token denied.
System.out.println("登入失敗" + e.getSummary()); // error="access_denied", error_description="Access token denied."
}
}
protected OAuth2ProtectedResourceDetails resource() {
ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();
List scopes = new ArrayList<String>(2);
scopes.add("account");
scopes.add("role");
resource.setAccessTokenUri("http://localhost:8081/oauth/token");
resource.setClientId("clientkpi");
resource.setClientSecret("123456");
resource.setGrantType("password");
resource.setScope(scopes);
resource.setUsername("sam.chu=");
resource.setPassword("12345678");
return resource;
}
不過基於 Spring Boot 的自動配置會亂數產生帳密 來做 Http basic 認證,剛開發的時候會有點煩
可以在 SpringBootApplication 暫時把它關閉
順便把 EnableOAuth2Client 加上
@EnableOAuth2Client
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
public class KpiApplication { public static void main(String[] args) {
SpringApplication.run(KpiApplication.class, args);
}
}
其他兩個範例是使用 RestTemplate 來新增跟取得的範例
public void restPost() throws IOException {
String url = "http://localhost:8082/api/v1/role";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON_UTF8));
headers.add("Authorization", String.format("%s %s", "bearer", "eyJhbGciOiJIUzI1.NiIsInR5cCI6I.kpXVCJ9"));
RoleDto roleDto = new RoleDto();
roleDto.setCode("ROLE_GINTAMA");
roleDto.setLabel("銀魂銀魂銀魂");
HttpEntity<RoleDto> entity = new HttpEntity<RoleDto>(roleDto, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class, new HashMap<String, String>());
if (response.getStatusCode().equals(HttpStatus.CREATED)) {
System.out.println(response.getBody());
}
}
取得資源
public void restGet() throws IOException {
String url = "http://localhost:8082/api/v1/role";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON_UTF8));
headers.add("Authorization", String.format("%s %s", "bearer", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsia3BpIiwiYWNjb3VudCJdLCJ1c2VyX25hbWUiOiJzYW0uY2h1PSIsInNjb3BlIjpbImFjY291bnQiLCJyb2xlIl0sImV4cCI6MTQ4NzU3NDUzNywiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6ImNiMzc0OGFmLTc2NGUtNDNiNy1iNTVjLTU4ZjQzZWQwOTU0MCIsImNsaWVudF9pZCI6ImNsaWVudGtwaSJ9.9Wwk5-GrJ_xdVOcOexoDhIXEznHqm3ssBfob0FeSFgA"));
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
if (response.getStatusCode().equals(HttpStatus.OK)) {
System.out.println(response.getBody());
}
}
← use JWT OAuth2 and spring-security Create AuthorizationServer
http://samchu.logdown.com/posts/1433379
http://www.tuicool.com/articles/eeQvy2j
OAthe2 Login use OkHttpClient and OAuth2RestTemplate的更多相关文章
- 「2020 新手必备 」极速入门 Retrofit + OkHttp 网络框架到实战,这一篇就够了!
老生常谈 什么是 Retrofit ? Retrofit 早已不是什么新技术了,想必看到这篇博客的大家都早已熟知,这里就不啰嗦了,简单介绍下: Retrofit 是一个针对 Java 和 Androi ...
- Android封装OkHttpClient的类库
由于android6.0的SDK没有HttpClient,只有HttpURLConnection和OkHttpClient,特记下OkHttpClient的使用方法 1.Ui测试界面布局 <?x ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 打开程序总是会提示“Enter password to unlock your login keyring” ,如何成功关掉?
p { margin-bottom: 0.1in; line-height: 120% } 一.一开始我是按照网友所说的 : rm -f ~/.gnome2/keyrings/login.keyrin ...
- Day01 login module
知识点:模块导入 变量赋值的两种形式 格式化输出 for循环 if...else 嵌套 #!C:\Program Files\Python35/bin # -*- conding:utf-8 ...
- Login控件尝试
新建web项目,添加default.aspx.Register.aspx.Login.aspx. default.aspx中添加LoginName.LoginStatus,LoginName的Form ...
- okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数
如标题所示,okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数,有遇到这样现象的朋友吗? 原因:因使用的是 ...
- [转载] 构造linux 系统下免密码ssh登陆 _How to establish password-less login with SSH
In present (post production) IT infrastructure many different workstations, servers etc. have to be ...
- Security9:查询Login被授予的权限
在给一个Login授予权限时,发现该Login已经存在,其对应的User也存在于指定的DB中,查看该Login在指定DB中已被授予的权限. 1,查看Login的Server PrincipalID s ...
随机推荐
- MySql常用操作语句(2:数据库、表管理以及数据操作)
本文主要内容转自一博文. 另外可供参考资源: SQL语句教程 SQL语法 1.数据库(database)管理 1.1 create 创建数据库 mysql> create database f ...
- Netmask, 子网与 CIDR (Classless Interdomain Routing)
Netmask, 子网与 CIDR (Classless Interdomain Routing) 我们前面谈到 IP 是有等级的,而设定在一般计算机系统上面的则是 Class A, B, C.现在我 ...
- EBS R12安装升级(FRESH)(三)
5 EBS R12.1.1安装后配置 5.1 新建patch文件夹 1 2 3 su - root mkdir /stage/patch chmod 777 /stage/patch 打补丁说明:随便 ...
- Oracle EBS ERP中月结年结的流程总结
月结与年结处理,是企业财务比较特殊而重要的业务操作.在实施与推广OracleERP系统过程中,如何结合现行的会计制度与惯例,充分利用软件功能,做好相应的关账.开账工作,是困扰许多企业财务人员乃至实施顾 ...
- 那些年Android开发中遇到的坑
使用静态变量来缓存数据时,不管是在Application类还是其他类,都要注意因应用重建而引发的问题. 使用DecorView作为PopupWindow的anchorView时,在华为P7中它是显示在 ...
- 企业级web负载均衡完美架构
转载:揭秘企业级web负载均衡完美架构(图) 2010-07-06 15:16 抚琴煮酒 51CTO.com 字号:T | T 相信很多朋友对企业级的负载均衡高可用实例非常感兴趣,此篇文章根据成熟的线 ...
- HTML元素的专用传参数据属性
把参数直接放到事件定义里面,类似下面这样,也是可以,但是这样不够Nice. <a href="javascript:void(0)" onclick="clickh ...
- jvm垃圾回收(三)
一.分代思想(年轻代.老年代.永久代): 1.一个新人(new对象)会优先在伊甸园(Eden区)出生,当伊甸园(Eden区)人口达到最大容量时,JVM会派MinorGC去看看哪些人还有价值 2.伊甸园 ...
- JSF-页面导航
页面导航 1)导航处理涉及的术语: -动作值:触发动作事件的组件的action:EL方法表达式.字符串文字. -结果值:动作组件的action属性的:EL方法表达式的返回值.字符串文字:或结果组件的o ...
- MQTT入手笔记
MQTT服务官网:http://mosquitto.org/download/ 在unix系统按照以下步骤运行并启动mqtt服务: 1. # 下载源代码包wget http://mosquitto.o ...