OAthe2 Login use OkHttpClient and OAuth2RestTemplate

來源:互聯網
上載者:User

標籤:frame   iss   rest   ati   protected   tco   exp   throws   .post   

 

http://samchu.logdown.com/posts/1437422-oathe2-login-use-okhttpclient-and-oauth2resttemplate?utm_source=tuicool&utm_medium=referral

 

如果要取得 OAuth 授權的話,可以直接使用 OkHttpClient 或是 OAuth2RestTemplate 來實作

在依賴中增加 OkHttpClient

build.gradle
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

build.gradle
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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.