JWT (JSON Web Token) adalah standar terbuka berbasis JSON (RFC 7519) yang diterapkan untuk mengajukan klaim antara lingkungan aplikasi jaringan. Token ini dirancang agar kompak dan aman, terutama cocok untuk skenario Single Sign-On (SSO) dari situs terdistribusi. Pernyataan JWT umumnya digunakan untuk melewati informasi identitas pengguna yang diautentikasi antara penyedia identitas dan penyedia layanan untuk memfasilitasi perolehan sumber daya dari server sumber daya. Ini juga dapat menambahkan beberapa informasi deklarasi tambahan yang diperlukan untuk logika bisnis lainnya. Token juga dapat digunakan secara langsung untuk otentikasi atau dienkripsi.
Biasanya, sangat berisiko untuk mengekspos API secara langsung. Jika Anda tidak membicarakan hal lain, Anda dapat meminumnya jika Anda langsung diserang oleh mesin. Secara umum, tingkat izin tertentu harus dibagi menjadi API, dan kemudian otentikasi pengguna dilakukan, dan API yang sesuai diberikan kepada pengguna berdasarkan hasil otentikasi. Saat ini, ada beberapa solusi utama:
OAuth adalah standar otorisasi terbuka yang memungkinkan pengguna untuk mengizinkan aplikasi pihak ketiga untuk mengakses sumber daya pribadi (seperti foto, video) yang disimpan oleh pengguna pada layanan tanpa memberikan nama pengguna dan kata sandi untuk aplikasi pihak ketiga.
OAuth memungkinkan pengguna untuk memberikan token alih -alih nama pengguna dan kata sandi untuk mengakses data yang mereka simpan di penyedia layanan tertentu. Setiap token mengesahkan sistem pihak ketiga tertentu (mis., Situs web pengeditan video) untuk mengakses sumber daya tertentu (mis., Hanya video dalam album tertentu) dalam periode waktu tertentu (mis., Dalam 2 jam ke depan). Dengan cara ini, OAuth memungkinkan pengguna untuk mengesahkan situs web pihak ketiga untuk mengakses informasi spesifik tertentu yang mereka simpan di penyedia layanan lain, daripada semua konten
Mekanisme otentikasi cookie adalah membuat objek sesi di server untuk permintaan otentikasi, dan pada saat yang sama membuat objek cookie di browser klien; Objek cookie dibawa ke klien untuk mencocokkan objek sesi di server untuk mencapai manajemen negara. Secara default, cookie akan dihapus ketika kita menutup browser. Namun, Anda dapat memodifikasi waktu kadaluwarsa cookie untuk membuat cookie valid untuk jangka waktu tertentu. Otentikasi berdasarkan metode sesi pasti akan memberikan tekanan pada server (penyimpanan memori), tidak mudah untuk diperluas (perlu menangani sesi terdistribusi), serangan pemalsuan permintaan lintas situs (CSRF)
1. Dibandingkan dengan sesi, tidak perlu disimpan di server dan tidak menempati overhead memori server.
2. Tanpa kewarganegaraan dan sangat diskalakan: misalnya, ada 3 mesin (A, B, C) untuk membentuk cluster server. Jika sesi ada di mesin A, sesi hanya dapat disimpan di salah satu server. Pada saat ini, Anda tidak dapat mengakses mesin B dan C, karena sesi tidak disimpan pada B dan C, dan menggunakan token dapat memverifikasi legitimasi permintaan pengguna. Tidak apa -apa bagi saya untuk menambahkan beberapa mesin lagi, jadi inilah artinya.
3. Pemisahan Front-End dan Dukungan Akses Domain Silang.
- Komposisi JWT
{ "iss": "JWT Builder", "iat": 1416797419, "exp": 1448333419, "aud": "www.battcn.com", "sub": "[email protected]", "GivenName": "Levin", "Surname": "Levin", "Email": "[email protected]", "peran": ["admin", "anggota"]}JWT sebenarnya adalah string, yang terdiri dari tiga bagian, header, muatan, dan tanda tangan (diurutkan secara berurutan pada gambar di atas)
JWT Token Generator: https://jwt.io/
- Otentikasi login
- Permintaan otentikasi
Token tidak valid
Token yang valid
Ada kelebihan dan kekurangan. Apakah itu berlaku harus dipertimbangkan dengan jelas, bukan teknologi dan gaya.
Pemetaan Kunci TokenProperties dengan Application.yml Resource, mudah digunakan
@Configuration@configurationproperties (prefix = "battcn.security.token") kelas publik TokenProperties { / *** {@link com.battcn.security.model.token.token} Waktu ekspirasi token* / private integer expirationtime; / *** penerbit*/ penerbit string pribadi; /*** tanda tangan menggunakan kunci {@link com.battcn.security.model.token.token}. */ Private String SigningKey; / *** {@link com.battcn.security.model.token.token} menyegarkan waktu kedaluwarsa*/ private integer refreshexptime; // setel ...} Kelas yang dihasilkan oleh token
@ComponentPublic Class TokenFactory {Private Final TokenProperties Properties; @Autowired Public TokenFactory (TokenProperties Properties) {this.properties = Properties; } / ** * Gunakan jjwt untuk menghasilkan token * @param Context * @return * / public accessToken createaccesstoken (konteks userContext) {opsional.ofnullable (context.getUserName ()). Orelsethrow (()-> new illegalargumentException ("tidak dapat membuat ke USERNOME")); Opsional.ofnullable (context.getAuthority ()). Orelsethrow (()-> new IllegalArgumentException ("Pengguna tidak memiliki hak istimewa")); Klaim klaim = jwts.claims (). SetSubject (context.getUserName ()); klaims.put ("scopes", context.getauthority (). stream (). Map (objek :: tostring) .collect (tolist ())); LocalDateTime currentTime = localDateTime.now (); String token = jwts.builder () .setClaims (klaim) .setissuer (properties.getissuer ()) .setisSuDat (date.from (currentTime.atzone (zonaid.systemdefault ()). TOINSTANT ()) .SetExiration (date.prom.preMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM (TETTIMLEMMMLUMMMLUT.LURTMMLUT.LURSTIMM (TEPLURMMLUMMM (TEPLURTMM.PROMK.PROMM.PROMM.PROMM.PROMM.PROMM. .atzone (zonaid.systemdefault ()). toInstant ())) .Signwith (Signaturealgorithm.hs512, properties.getSigningKey ()) .compact (); mengembalikan AccessToken baru (token, klaim); } / ** * Hasilkan dan refresh RefreshToken * @param userContext * @return * / token public createFreshToken (usercontext userContext) {if (stringutils.isblank (usercontext.getusername ())) {throw new illegalargumentException ("tidak dapat membuat tokenName ())) {lempar new ilegalargument (" tidak dapat membuat tokenName ())) {throw; } LocalDateTime currentTime = localDateTime.now (); Klaim klaim = jwts.claims (). SetSubject (usercontext.getusername ()); klaims.put ("scopes", arrays.aslist (scopes.refresh_token.authority ()))); String token = jwts.builder () .setClaims (klaim) .setissuer (properties.getissuer ()) .setId (uuid.randomuuid (). Tostring ()) .setisSuDat (date.from (currentTime.atzone (zonaid.sysystemDefault ()). .plusminutes (properties.getRefreshexpTime ())) .atzone (zonaid.systemdefault ()). toInstant ())) .Signwith (Signaturealgorith.hs512, properties.getSigningKey ()) .compact (); mengembalikan AccessToken baru (token, klaim); }} File konfigurasi, termasuk waktu kedaluwarsa token, kunci rahasia, dapat diperluas dengan sendirinya
Battcn: Keamanan: Token: Waktu Kedaluwarsa: 10 # Minutes 1440 Refresh-Exp-Time: 30 # Minutes 2880 Penerbit: http://blog.battcn.com Penandatanganan-Key: Battcn
WebsecurityConfig adalah konfigurasi utama keamanan musim semi. Dalam keamanan, kami pada dasarnya dapat mengimplementasikan fungsi yang kami inginkan dengan mendefinisikan filter.
@Configuration@enableWebSecurityPublic kelas WebSecurityConfig Extends WebSecurityConfigurerAdapter {public static final string Token_header_param = "x-authorization"; string final statis public Form_based_login_entry_point = "/API/AUTH/LOGIN"; string final public static Token_based_auth_entry_point = "/API/**"; string akhir public static kelola_token_based_auth_entry_point = "/kelola/**"; string final statis publik token_refresh_entry_point = "/API/auth/token"; @Autowired Private RestAuthenticationEntrypoint AuthenticationEntrypoint; @Autowired Private AuthenticationsUCCessHandler Successhandler; @Autowired Private AuthenticationFailureRandler Failhandler; @Autowired private LoginauthenticationProvider LoginauthenticationProvider; @Autowired private TokenAuthenticationProvider TokenAuthenticationProvider; @Autowired TokenExtractor TokenExtractor; @Autowired Private AuthenticationManager AuthenticationManager; LoginProcessingFilter Protected BuildLoginProcessingFilter () melempar Exception {LoginProcessingFilter filter = NEW LOGINPROCESSINGFILTER (FORM_BASED_LOGIN_ENTRY_POIN, SUCCESSHANDLER, FAILDINEDLER); filter.setAuthenticationManager (this.authenticationManager); filter pengembalian; } Dilindungi TokenAuthenticationProcessingFilter BuildTokenAuthenticationProcessingFilter () melempar Exception {List <string> list = lists.newarraylist (Token_Based_Auth_entry_Point, kelola_token_based_auth_entry_point); SKIPPATHREQUESTMATCHER Matcher = baru SkippathRequestMatcher (Daftar); TokenAuthenticationProcessingFilter Filter = TokenAuthenticationProcessingFilter baru (failhandler, tokenExtractor, pencocokan); filter.setAuthenticationManager (this.authenticationManager); filter pengembalian; } @Bean @Override AuthenticationManager AuthenticationManagerBean () melempar Exception {return super.authenticationManagerBean (); } @Override Protected void configure (authenticationManagerBuilder auth) {auth.authenticationProvider (loginAuthenticationProvider); auth.authenticationProvider (TokenAuthenticationProvider); } @Override Protected void configure (httpsecurity http) melempar Exception {http .csrf (). Disable () // karena menggunakan jwt, Anda dapat mematikan csrf di sini. .SessionCreationPolicy (sessionCreationPolicy.Stateless) .and () .AuthorizeRequests () .Antmatchers (form_based_login_entry_point) .permitall () // Login-titik .Toint (Token_Refresh_entry_point) .PerMitall (TOKEN_REFRESH_ENTRY) .PERMITOLL (TOKEN_REFRESH_ENTRY) .PERMITOLLE (TOKEN_REFRESH_ENTRY) .PERMITOLE (TOKEN_REFRESH_ENTRY) .PERMITALL (TOKEN_REFRESH_ENTRY). .Authorizerequests () .Antmatchers (Token_Based_Auth_entry_Point) .authenticated () // API-point yang dilindungi .Antmatchers (kelola_token_based_auth_entry_point) .hasanyrole (roleenum.admin.name ()) .andan () .addfilterBefore (buildloginProcessingFilter (), UsernamepasswordAuthenticationFilter.class) .addfilterBefore (buildTokenAuthenticationProcessingFilter (), UsernamepasswordAuthenticationFilter.class); }}Karena kode JWT hanya dienkapsulasi dan berisi banyak konten, hanya fragmen utama yang diposting dalam artikel. Jika kode lengkap diperlukan, Anda dapat langsung mendapatkannya dari git berikut
Kode Bab ini (Battcn-jwt-service): http://xiazai.vevb.com/201801/yuanma/battcn-cloud_jb51.rar
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.