zoukankan      html  css  js  c++  java
  • 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

    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

  • 相关阅读:
    Python 基础 (三)
    Python 基础(二)
    软件工程第四周作业
    软件工程第四周作业
    软件工程第四次作业
    软件工程第四周作业
    软件工程第三次作业
    软件工程第三周作业
    软件工程第三次作业
    Python学习之路5
  • 原文地址:https://www.cnblogs.com/softidea/p/7045809.html
Copyright © 2011-2022 走看看