1. Pengenalan
Dalam tutorial ini, kita akan melihat perpustakaan ScribeJava.
ScribeJava adalah pelanggan OAuth sederhana untuk Java yang membantu menguruskan aliran OAuth.
Ciri utama perpustakaan adalah bahawa ia menyokong semua API OAuth 1.0 dan 2.0 utama di luar kotak. Lebih-lebih lagi, jika kita harus bekerjasama dengan API yang tidak disokong, perpustakaan menyediakan beberapa kelas untuk melaksanakan API OAuth kami.
Satu lagi ciri penting ialah memilih pelanggan mana yang akan digunakan. Memang, ScribeJava menyokong beberapa klien HTTP:
- Pelanggan Async Http
- OkHttp
- Apache HttpComponents HttpClient
Lebih jauh lagi, perpustakaan ini selamat digunakan pada utas dan serasi dengan Java7, jadi kami dapat menggunakannya di lingkungan lama.
2. Kebergantungan
ScribeJava disusun menjadi modul inti dan API , yang terakhir merangkumi sekumpulan API luaran (Google, GitHub, Twitter, dll) dan artifak teras:
com.github.scribejava scribejava-apis latest-version
Sekiranya kita hanya memerlukan kelas teras tanpa API luaran, kita harus menarik hanya modul teras:
com.github.scribejava scribejava-core latest-version
Versi terkini boleh didapati di repositori Maven.
3. Perkhidmatan OAuth
Bahagian utama perpustakaan adalah kelas abstrak OAuthService yang mengandungi semua parameter yang diperlukan untuk menguruskan 'handshake' OAuth dengan betul.
Bergantung kepada versi protokol, kami akan menggunakan Oauth10Service atau Oauth20Service kelas konkrit masing-masing untuk OAuth 1.0 dan OAuth 2.0.
Untuk membina pelaksanaan OAuthService , perpustakaan menyediakan ServiceBuilder:
OAuthService service = new ServiceBuilder("api_key") .apiSecret("api_secret") .scope("scope") .callback("callback") .build(GoogleApi20.instance());
Kita harus menetapkan token api_key dan api_secret yang diberikan oleh pelayan kebenaran.
Kami juga dapat menetapkan ruang lingkup permintaan dan panggilan balik yang harus dilayan oleh pelayan kebenaran ke pengguna pada akhir aliran kebenaran.
Perhatikan bahawa bergantung pada versi protokol tidak semua parameter wajib.
Akhirnya, kita harus membina OAuthService memanggil kaedah build () dan memberikannya contoh API yang ingin kita gunakan. Kami boleh mendapatkan senarai lengkap API yang disokong di ScribeJava GitHub.
3.1. Pelanggan HTTP
Selain itu, perpustakaan membolehkan kita memilih Pelanggan HTTP mana yang akan digunakan:
ServiceBuilder builder = new ServiceBuilder("api_key") .httpClient(new OkHttpHttpClient());
Sudah tentu, kami telah memasukkan kebergantungan yang diperlukan, untuk contoh sebelumnya:
com.github.scribejava scribejava-httpclient-okhttp latest-version
Versi terkini boleh didapati di repositori Maven.
3.2. Mod Debug
Di samping itu, terdapat mod debug yang dapat kita gunakan untuk membantu kita menyelesaikan masalah:
ServiceBuilder builder = new ServiceBuilder("api_key") .debug();
Kita hanya perlu memanggil kaedah debug () . Debug akan dikeluarkan ke System.out beberapa maklumat yang relevan.
Juga, jika kita ingin menggunakan output yang berbeza, ada kaedah lain yang menerima OutputStream untuk mengirim maklumat debugging ke:
FileOutputStream debugFile = new FileOutputStream("debug"); ServiceBuilder builder = new ServiceBuilder("api_key") .debug() .debugStream(debugFile);
4. Aliran OAuth 1.0
Sekarang mari kita fokus pada bagaimana menangani aliran OAuth1.
Dalam contoh ini, kita akan mendapatkan token akses dengan API Twitter dan kita akan menggunakannya untuk membuat permintaan.
Pertama sekali, kita harus membina Oauth10Service , seperti yang kita lihat sebelumnya, menggunakan pembangun:
OAuth10aService service = new ServiceBuilder("api_key") .apiSecret("api_secret") .build(TwitterApi.instance());
Setelah kami mempunyai OAuth10Service, kami dapat permintaanToken dan menggunakannya untuk mendapatkan URL kebenaran:
OAuth1RequestToken requestToken = service.getRequestToken(); String authUrl = service.getAuthorizationUrl(requestToken);
Pada ketika ini, perlu mengarahkan pengguna ke authUrl dan mendapatkan oauthVerifier yang disediakan oleh halaman.
Oleh itu, kami menggunakan oauthVerifier untuk mendapatkan accessToken :
OAuth1AccessToken accessToken = service.getAccessToken(requestToken,oauthVerifier);
Akhirnya, kita dapat membuat permintaan menggunakan objek OAuthRequest dan menambahkan token kepadanya dengan kaedah signRequest () :
OAuthRequest request = new OAuthRequest(Verb.GET, "//api.twitter.com/1.1/account/verify_credentials.json"); service.signRequest(accessToken, request); Response response = service.execute(request);
Sebagai hasil dari pelaksanaan permintaan itu , kami mendapat objek Respons .
5. Aliran OAuth 2.0
Aliran OAuth 2.0 tidak jauh berbeza dengan OAuth 1.0. Untuk menjelaskan variasi ini, kami akan mendapatkan token akses dengan Google API.
Dengan cara yang sama, kita lakukan dalam aliran OAuth 1.0, kita harus membina OAuthService dan mendapatkan authUrl , tetapi kali ini kita akan menggunakan contoh OAuth20Service :
OAuth20Service service = new ServiceBuilder("api_key") .apiSecret("api_secret") .scope("//www.googleapis.com/auth/userinfo.email") .callback("//localhost:8080/auth") .build(GoogleApi20.instance()); String authUrl = service.getAuthorizationUrl();
Perhatikan bahawa, dalam hal ini, kita perlu memberikan ruang lingkup permintaan dan panggilan balik yang akan dihubungi pada akhir aliran kebenaran.
Demikian juga, kita harus mengalihkan pengguna ke authUrl dan mengambil parameter kod dalam url panggilan balik:
OAuth2AccessToken accessToken = service.getAccessToken(code); OAuthRequest request = new OAuthRequest(Verb.GET, "//www.googleapis.com/oauth2/v1/userinfo?alt=json"); service.signRequest(accessToken, request); Response response = service.execute(request);
Pada akhirnya, untuk membuat permintaan , kami mendapatkan kaedah accessToken dengan getAccessToken () .
6. API tersuai
Kita mungkin harus bekerjasama dengan API yang tidak disokong oleh ScribeJava. Dalam keadaan seperti itu, perpustakaan membolehkan kami menerapkan API kami sendiri .
Satu-satunya perkara yang perlu kita lakukan ialah menyediakan pelaksanaan kelas DefaultApi10 atau DefaultApi20 .
Bayangkan kita mempunyai pelayan kebenaran OAuth 2.0 dengan pemberian kata laluan. Dalam kes ini, kita dapat menerapkan DefaultApi20 sehingga kita dapat mengambil token akses :
public class MyApi extends DefaultApi20 { public MyApi() {} private static class InstanceHolder { private static final MyApi INSTANCE = new MyApi(); } public static MyApi instance() { return InstanceHolder.INSTANCE; } @Override public String getAccessTokenEndpoint() { return "//localhost:8080/oauth/token"; } @Override protected String getAuthorizationBaseUrl() { return null; } }
Oleh itu, kita boleh mendapatkan token akses dengan cara yang sama seperti sebelumnya:
OAuth20Service service = new ServiceBuilder("baeldung_api_key") .apiSecret("baeldung_api_secret") .scope("read write") .build(MyApi.instance()); OAuth2AccessToken token = service.getAccessTokenPasswordGrant(username, password); OAuthRequest request = new OAuthRequest(Verb.GET, "//localhost:8080/me"); service.signRequest(token, request); Response response = service.execute(request);
7. Kesimpulannya
Dalam artikel ini, kami melihat kelas yang paling berguna yang disediakan oleh ScribeJava.
Kami belajar bagaimana menangani aliran OAuth 1.0 dan OAuth 2.0 dengan API luaran. Kami juga belajar bagaimana mengkonfigurasi perpustakaan untuk menggunakan API kami sendiri.
Seperti biasa, semua sampel kod yang ditunjukkan dalam tutorial ini terdapat di GitHub.