﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-OAUTH2</title><link>http://www.blogjava.net/paulwong/category/54901.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 07 Jan 2022 13:33:46 GMT</lastBuildDate><pubDate>Fri, 07 Jan 2022 13:33:46 GMT</pubDate><ttl>60</ttl><item><title>OAUTH2 - 4流程如何选择？</title><link>http://www.blogjava.net/paulwong/archive/2022/01/06/438648.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 06 Jan 2022 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/01/06/438648.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/438648.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/01/06/438648.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/438648.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/438648.html</trackback:ping><description><![CDATA[<a href="https://developer.okta.com/img/oauth_grant_flowchart.png" target="_blank">
<img src="https://developer.okta.com/img/oauth_grant_flowchart.png" width="600" height="254" alt="" />
</a><br /><br />
<br />
<br />
<a href="https://developer.okta.com/docs/concepts/oauth-openid/#what-kind-of-client-are-you-building" target="_blank">https://developer.okta.com/docs/concepts/oauth-openid/#what-kind-of-client-are-you-building</a><img src ="http://www.blogjava.net/paulwong/aggbug/438648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2022-01-06 13:37 <a href="http://www.blogjava.net/paulwong/archive/2022/01/06/438648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OIDC - KEYCLOAK - 自定义CLIENT SCOPE</title><link>http://www.blogjava.net/paulwong/archive/2021/12/22/436242.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 22 Dec 2021 03:15:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/12/22/436242.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/436242.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/12/22/436242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/436242.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/436242.html</trackback:ping><description><![CDATA[当CLIENT或用户在KEYCLOAK中成功登录后，会返回JWT字符串，其中默认含有权限的信息，但此信息以内嵌的方式呈现，非常不方便。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #800000; ">"</span><span style="color: #800000; ">resource_access</span><span style="color: #800000; ">"</span>:&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">app-springboot-confidential</span><span style="color: #800000; ">"</span>:&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">roles</span><span style="color: #800000; ">"</span>:&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">user</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">test-employee-service</span><span style="color: #800000; ">"</span>:&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">roles</span><span style="color: #800000; ">"</span>:&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">READ_EMPLOYEE</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">service-springboot</span><span style="color: #800000; ">"</span>:&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">roles</span><span style="color: #800000; ">"</span>:&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">READ_PRODUCTS</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">account</span><span style="color: #800000; ">"</span>:&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">roles</span><span style="color: #800000; ">"</span>:&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">manage-account</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">manage-account-links</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">test-department-service</span><span style="color: #800000; ">"</span>:&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">roles</span><span style="color: #800000; ">"</span>:&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">READ_DEPARTMENT</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}</div><br /><ul><li>需要将权限的信息输出到一个KEY中，这时可以新增自定义CLIENT SCOPE。Mapper中新增KEYCLOAK已内置的【realm roles/client roles】，定义输出到JTW的字段名：my-roles。</li><li>授权哪些CLIENT可以读取此CLIENT SCOPE.</li><li>在登录参数scope中，加入此值：my-roles，这样在输出的JWT就会以平面的方式输出所有roles</li></ul><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #800000; ">"</span><span style="color: #800000; ">my-roles</span><span style="color: #800000; ">"</span>:&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">user</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">READ_EMPLOYEE</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">READ_PRODUCTS</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">manage-account</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">manage-account-links</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">READ_DEPARTMENT</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">offline_access</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">user</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;]</div><br /><ul><li>SPRING SECURITY中取出权限信息：<br /><br /></li></ul><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ReactiveJwtAuthenticationConverter&nbsp;jwtAuthenticationConverter(ObjectMapper&nbsp;objectMapper)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JwtGrantedAuthoritiesConverter&nbsp;jwtGrantedAuthoritiesConverter&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JwtGrantedAuthoritiesConverter();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jwtGrantedAuthoritiesConverter.setAuthorityPrefix("ROLE_");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName("my-roles");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeycloakRealmRoleConverter&nbsp;keycloakRealmRoleConverter&nbsp;=&nbsp;new&nbsp;KeycloakRealmRoleConverter(objectMapper);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReactiveJwtGrantedAuthoritiesConverterAdapter&nbsp;reactiveJwtGrantedAuthoritiesConverterAdapter&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReactiveJwtGrantedAuthoritiesConverterAdapter(<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;KeycloakRealmRoleConverter(objectMapper);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jwtGrantedAuthoritiesConverter<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReactiveJwtAuthenticationConverter&nbsp;jwtConverter&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReactiveJwtAuthenticationConverter();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jwtConverter.setJwtGrantedAuthoritiesConverter(reactiveJwtGrantedAuthoritiesConverterAdapter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;jwtConverter;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><ul><li>判断是否有权限</li></ul><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->ServerHttpSecurity<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.authorizeExchange(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;-&gt;&nbsp;a.pathMatchers("/",&nbsp;"/error").permitAll()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.pathMatchers(HttpMethod.GET,&nbsp;"/protected/**").hasRole("READ_DEPARTMENT")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.anyExchange()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.authenticated()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)</div><img src ="http://www.blogjava.net/paulwong/aggbug/436242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-12-22 11:15 <a href="http://www.blogjava.net/paulwong/archive/2021/12/22/436242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OAUTH2 - 4流程</title><link>http://www.blogjava.net/paulwong/archive/2021/12/16/436095.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 16 Dec 2021 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/12/16/436095.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/436095.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/12/16/436095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/436095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/436095.html</trackback:ping><description><![CDATA[<img src="https://miro.medium.com/max/1050/1*wWs1vAAUFMPhFtp0iFGpEg.png" width="600" height="430" alt="" /><br />
<br /><br /><h2>
Authorization Code Grant</h2>
<img src="https://miro.medium.com/max/2842/1*anmFPvD_EVMiZOo-W76qyA.png" width="600" alt="" /><br />
<br /><br /><h2>Implicit Grant Flow</h2>
<img src="https://miro.medium.com/max/2520/1*HHqzb0tGtxGw68MIP3oBaw.png" width="600" height="504" alt="" /><br /><br /><br /><h2>Client Credential</h2><img src="https://miro.medium.com/max/2110/1*v-ubkjTKTSVRxIBTxK4MgQ.png" width="600" height="421" alt="" /><br /><br /><br /><br /><h2>Password Grant flow</h2><img src="https://miro.medium.com/max/2850/1*wkgiXdBnGof02eMYyqzWiQ.png" width="600" height="445" alt="" /><br /><br /><br /><br /><a href="https://itnext.io/an-oauth-2-0-introduction-for-beginners-6e386b19f7a9" target="_blank">https://itnext.io/an-oauth-2-0-introduction-for-beginners-6e386b19f7a9</a><img src ="http://www.blogjava.net/paulwong/aggbug/436095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-12-16 16:14 <a href="http://www.blogjava.net/paulwong/archive/2021/12/16/436095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OAUTH2 - SPRING SECURITY + KEYCLOAK</title><link>http://www.blogjava.net/paulwong/archive/2021/11/03/436029.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 03 Nov 2021 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/11/03/436029.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/436029.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/11/03/436029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/436029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/436029.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 根据OAUTH2协议，如果需要用户协助的，则使用authorization_code流程，此时需要用户登录页面、CLIENT SERVER、RESOURCE SERVER和AUTHORIZATION SERVER，其中CLIENT SERVER是通过http调用RESOURCE SERVER的api，AUTHORIZATION SERVER使用现成的KEYCLOAK。如果不需要用户协助的，即SER...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2021/11/03/436029.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/436029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-11-03 16:58 <a href="http://www.blogjava.net/paulwong/archive/2021/11/03/436029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BOOT OAUTH2 + KEYCLOAK - service to service call</title><link>http://www.blogjava.net/paulwong/archive/2021/10/26/436021.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 26 Oct 2021 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/10/26/436021.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/436021.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/10/26/436021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/436021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/436021.html</trackback:ping><description><![CDATA[employee-service调用department-service，如果要按OAUTH2.0流程，只需要提供client-id和client-secrect即可。在KEYCLOAK中引入service-account，即配置该employee-service时，取消standard-flow，同时激活service-account。<br />employee-service的application.yaml文件，其中的public-key要从KEYCLOAK中取<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->server:<br />&nbsp;&nbsp;&nbsp;port:&nbsp;8090<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Can&nbsp;be&nbsp;set&nbsp;to&nbsp;false&nbsp;to&nbsp;disable&nbsp;security&nbsp;during&nbsp;local&nbsp;development</span><span style="color: #008000; "><br /></span>rest:<br />&nbsp;&nbsp;&nbsp;security:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enabled:&nbsp;true<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">issuer-uri:&nbsp;http://localhost:8080/auth/realms/dev</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;api-matcher:&nbsp;/api/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cors:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allowed-origins:&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">*</span><span style="color: #800000; ">'</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allowed-headers:&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">*</span><span style="color: #800000; ">'</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allowed-methods:&nbsp;GET,POST,PUT,PATCH,DELETE,OPTIONS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max-age:&nbsp;3600<br /><br />security:<br />&nbsp;&nbsp;&nbsp;oauth2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resource:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter-order:&nbsp;3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:&nbsp;test-employee-service<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token-info-uri:&nbsp;${rest.security.issuer-uri}/protocol/openid-connect/token/introspect<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user-info-uri:&nbsp;${rest.security.issuer-uri}/protocol/openid-connect/userinfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jwt:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key-value:&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----BEGIN&nbsp;PUBLIC&nbsp;KEY-----<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----END&nbsp;PUBLIC&nbsp;KEY-----<br /><br /><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;To&nbsp;access&nbsp;another&nbsp;secured&nbsp;micro-service</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client-id:&nbsp;test-employee-service<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">client-secret:&nbsp;25c33006-e1b9-4fc2-a6b9-c43dbc41ecd0</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user-authorization-uri:&nbsp;${rest.security.issuer-uri}/protocol/openid-connect/auth<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access-token-uri:&nbsp;${rest.security.issuer-uri}/protocol/openid-connect/token<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scope:&nbsp;openid<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grant-type:&nbsp;client_credentials<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">is</span>-client-only:&nbsp;true<br /><br /><span style="color: #008000; ">#</span><span style="color: #008000; ">Logging&nbsp;Configuration</span><span style="color: #008000; "><br /></span>logging:<br />&nbsp;&nbsp;&nbsp;level:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.boot.autoconfigure.logging:&nbsp;INFO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.security:&nbsp;DEBUG<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.arun:&nbsp;DEBUG<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root:&nbsp;INFO</div><br />application-dev.yaml<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->rest:<br />&nbsp;&nbsp;&nbsp;security:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;issuer-uri:&nbsp;http://10.80.27.69:8180/auth/realms/quickstart<br /><br />department-service:<br />&nbsp;&nbsp;&nbsp;url:&nbsp;http://10.80.27.69:8095/api/departments/1<br /><br />security:<br />&nbsp;&nbsp;&nbsp;oauth2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client-secret:&nbsp;db25cdbd-605b-429d-bd92-96705bdf1474</div><br />department-service的application.yaml<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->server:<br />&nbsp;&nbsp;&nbsp;port:&nbsp;8095<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Can&nbsp;be&nbsp;set&nbsp;to&nbsp;false&nbsp;to&nbsp;disable&nbsp;security&nbsp;during&nbsp;local&nbsp;development</span><span style="color: #008000; "><br /></span>rest:<br />&nbsp;&nbsp;&nbsp;security:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enabled:&nbsp;true<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">issuer-uri:&nbsp;http://localhost:8080/auth/realms/dev</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;api-matcher:&nbsp;/api/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cors:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allowed-origins:&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">*</span><span style="color: #800000; ">'</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allowed-headers:&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">*</span><span style="color: #800000; ">'</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allowed-methods:&nbsp;GET,POST,PUT,PATCH,DELETE,OPTIONS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max-age:&nbsp;3600<br /><br />security:<br />&nbsp;&nbsp;&nbsp;oauth2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resource:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter-order:&nbsp;3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:&nbsp;test-department-service<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token-info-uri:&nbsp;${rest.security.issuer-uri}/protocol/openid-connect/token/introspect<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user-info-uri:&nbsp;${rest.security.issuer-uri}/protocol/openid-connect/userinfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jwt:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key-value:&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----BEGIN&nbsp;PUBLIC&nbsp;KEY-----<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----END&nbsp;PUBLIC&nbsp;KEY-----<br /><br /><span style="color: #008000; ">#</span><span style="color: #008000; ">Logging&nbsp;Configuration</span><span style="color: #008000; "><br /></span>logging:<br />&nbsp;&nbsp;&nbsp;level:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.boot.autoconfigure.logging:&nbsp;INFO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.security:&nbsp;DEBUG<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.arun:&nbsp;DEBUG<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root:&nbsp;INFO</div><br />application-dev.yaml<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->rest:<br />&nbsp;&nbsp;&nbsp;security:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;issuer-uri:&nbsp;http://10.80.27.69:8180/auth/realms/quickstart</div><br />employee-service的pom.xml<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">project&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://maven.apache.org/POM/4.0.0"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://maven.apache.org/POM/4.0.0&nbsp;http://maven.apache.org/xsd/maven-4.0.0.xsd"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">modelVersion</span><span style="color: #0000FF; ">&gt;</span>4.0.0<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">modelVersion</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">parent</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-starter-parent<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>2.1.18.RELEASE<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">relativePath&nbsp;</span><span style="color: #0000FF; ">/&gt;</span>&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;lookup&nbsp;parent&nbsp;from&nbsp;repository&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">parent</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.arun.springoauth<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-oauth2-employee-service<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>1.0.0<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">name</span><span style="color: #0000FF; ">&gt;</span>spring-oauth2-employee-service<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">name</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">description</span><span style="color: #0000FF; ">&gt;</span>Employee&nbsp;Service<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">description</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">java</span><span style="color: #FF0000; ">.version</span><span style="color: #0000FF; ">&gt;</span>1.8<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">java.version</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">spring-boot</span><span style="color: #FF0000; ">.version</span><span style="color: #0000FF; ">&gt;</span>2.1.18.RELEASE<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">spring-boot.version</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependencies</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-starter-security<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.security.oauth.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-security-oauth2-autoconfigure<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&lt;version&gt;2.1.18.RELEASE&lt;/version&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>${spring-boot.version}<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-starter-web<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-devtools<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span>runtime<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-configuration-processor<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">optional</span><span style="color: #0000FF; ">&gt;</span>true<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">optional</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.projectlombok<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>lombok<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">optional</span><span style="color: #0000FF; ">&gt;</span>true<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">optional</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-starter-test<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span>test<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.security<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-security-test<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span>test<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependencies</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">build</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">plugins</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">plugin</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-maven-plugin<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">configuration</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">layout</span><span style="color: #0000FF; ">&gt;</span>ZIP<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">layout</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">excludes</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">exclude</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>*<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>*<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">exclude</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">excludes</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">includes</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">include</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>com.paul<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">include</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">includes</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">configuration</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">plugin</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">plugins</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">build</span><span style="color: #0000FF; ">&gt;</span><br /><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">project</span><span style="color: #0000FF; ">&gt;</span></div><br />将jwt格式的access_token转成Authentication的类JwtAccessTokenCustomizer<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;org.arun.springoauth.employee.config;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.databind.JsonNode;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.databind.ObjectMapper;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.HashSet;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Set;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.security.oauth2.resource.JwtAccessTokenConverterConfigurer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.security.authentication.UsernamePasswordAuthenticationToken;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.security.core.Authentication;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.security.core.GrantedAuthority;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.security.core.authority.AuthorityUtils;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.security.oauth2.provider.OAuth2Authentication;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.security.oauth2.provider.OAuth2Request;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;<br /><br />@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JwtAccessTokenCustomizer&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;DefaultAccessTokenConverter&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;JwtAccessTokenConverterConfigurer&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Logger&nbsp;LOG&nbsp;=&nbsp;LoggerFactory.getLogger(JwtAccessTokenCustomizer.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;CLIENT_NAME_ELEMENT_IN_JWT&nbsp;=&nbsp;"resource_access";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;ROLE_ELEMENT_IN_JWT&nbsp;=&nbsp;"roles";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ObjectMapper&nbsp;mapper;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JwtAccessTokenCustomizer(ObjectMapper&nbsp;mapper)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.mapper&nbsp;=&nbsp;mapper;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("Initialized&nbsp;{}",&nbsp;JwtAccessTokenCustomizer.<span style="color: #0000FF; ">class</span>.getSimpleName());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;configure(JwtAccessTokenConverter&nbsp;converter)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;converter.setAccessTokenConverter(<span style="color: #0000FF; ">this</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("Configured&nbsp;{}",&nbsp;JwtAccessTokenConverter.<span style="color: #0000FF; ">class</span>.getSimpleName());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Spring&nbsp;oauth2&nbsp;expects&nbsp;roles&nbsp;under&nbsp;authorities&nbsp;element&nbsp;in&nbsp;tokenMap,&nbsp;but<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;keycloak&nbsp;provides&nbsp;it&nbsp;under&nbsp;resource_access.&nbsp;Hence&nbsp;extractAuthentication<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;method&nbsp;is&nbsp;overriden&nbsp;to&nbsp;extract&nbsp;roles&nbsp;from&nbsp;resource_access.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;OAuth2Authentication&nbsp;with&nbsp;authorities&nbsp;for&nbsp;given&nbsp;application<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;OAuth2Authentication&nbsp;extractAuthentication(Map&lt;String,&nbsp;?&gt;&nbsp;tokenMap)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.debug("Begin&nbsp;extractAuthentication:&nbsp;tokenMap&nbsp;=&nbsp;{}",&nbsp;tokenMap);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JsonNode&nbsp;token&nbsp;=&nbsp;mapper.convertValue(tokenMap,&nbsp;JsonNode.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&lt;String&gt;&nbsp;audienceList&nbsp;=&nbsp;extractClients(token);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;extracting&nbsp;client&nbsp;names</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;GrantedAuthority&gt;&nbsp;authorities&nbsp;=&nbsp;extractRoles(token);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;extracting&nbsp;client&nbsp;roles</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OAuth2Authentication&nbsp;authentication&nbsp;=&nbsp;<span style="color: #0000FF; ">super</span>.extractAuthentication(tokenMap);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OAuth2Request&nbsp;oAuth2Request&nbsp;=&nbsp;authentication.getOAuth2Request();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OAuth2Request&nbsp;request&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;OAuth2Request(oAuth2Request.getRequestParameters(),&nbsp;oAuth2Request.getClientId(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authorities,&nbsp;<span style="color: #0000FF; ">true</span>,&nbsp;oAuth2Request.getScope(),&nbsp;audienceList,&nbsp;<span style="color: #0000FF; ">null</span>,&nbsp;<span style="color: #0000FF; ">null</span>,&nbsp;<span style="color: #0000FF; ">null</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Authentication&nbsp;usernamePasswordAuthentication&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;UsernamePasswordAuthenticationToken(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authentication.getPrincipal(),&nbsp;"N/A",&nbsp;authorities);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.debug("End&nbsp;extractAuthentication");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;OAuth2Authentication(request,&nbsp;usernamePasswordAuthentication);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;List&lt;GrantedAuthority&gt;&nbsp;extractRoles(JsonNode&nbsp;jwt)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.debug("Begin&nbsp;extractRoles:&nbsp;jwt&nbsp;=&nbsp;{}",&nbsp;jwt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&lt;String&gt;&nbsp;rolesWithPrefix&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashSet&lt;&gt;();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jwt.path(CLIENT_NAME_ELEMENT_IN_JWT).elements().forEachRemaining(e&nbsp;-&gt;&nbsp;e.path(ROLE_ELEMENT_IN_JWT).elements()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEachRemaining(r&nbsp;-&gt;&nbsp;rolesWithPrefix.add("ROLE_"&nbsp;+&nbsp;r.asText())));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;List&lt;GrantedAuthority&gt;&nbsp;authorityList&nbsp;=&nbsp;AuthorityUtils<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createAuthorityList(rolesWithPrefix.toArray(<span style="color: #0000FF; ">new</span>&nbsp;String[0]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.debug("End&nbsp;extractRoles:&nbsp;roles&nbsp;=&nbsp;{}",&nbsp;authorityList);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;authorityList;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Set&lt;String&gt;&nbsp;extractClients(JsonNode&nbsp;jwt)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.debug("Begin&nbsp;extractClients:&nbsp;jwt&nbsp;=&nbsp;{}",&nbsp;jwt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(jwt.has(CLIENT_NAME_ELEMENT_IN_JWT))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JsonNode&nbsp;resourceAccessJsonNode&nbsp;=&nbsp;jwt.path(CLIENT_NAME_ELEMENT_IN_JWT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Set&lt;String&gt;&nbsp;clientNames&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashSet&lt;&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resourceAccessJsonNode.fieldNames().forEachRemaining(clientNames::add);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.debug("End&nbsp;extractClients:&nbsp;clients&nbsp;=&nbsp;{}",&nbsp;clientNames);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;clientNames;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IllegalArgumentException(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Expected&nbsp;element&nbsp;"&nbsp;+&nbsp;CLIENT_NAME_ELEMENT_IN_JWT&nbsp;+&nbsp;"&nbsp;not&nbsp;found&nbsp;in&nbsp;token");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /><br /><br />Reference<br /><a href="https://medium.com/@bcarunmail/securing-rest-api-using-keycloak-and-spring-oauth2-6ddf3a1efcc2" target="_blank">https://medium.com/@bcarunmail/securing-rest-api-using-keycloak-and-spring-oauth2-6ddf3a1efcc2</a><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/436021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-10-26 17:06 <a href="http://www.blogjava.net/paulwong/archive/2021/10/26/436021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用REST API与KEYCLOAK进行OUATH2协议的登录认证</title><link>http://www.blogjava.net/paulwong/archive/2021/10/12/436009.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 12 Oct 2021 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/10/12/436009.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/436009.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/10/12/436009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/436009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/436009.html</trackback:ping><description><![CDATA[KEYCLOAK是一套用户、WEB API登录管理，授权管理的WEB应用。<br />如果要访问受KEYCLOAK保护的REST API服务，则需要夹带一个ACCESS_TOKEN。<br /><br />前端页面：<br /><ul><li>前端页面一般是给用户使用的，则需要用户输入在KEYCLOAK中有效的用户名和密码，并提供CALL BAK的URL，提交给KEYCLOAK<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http://10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/auth?client_id=app-springboot-confidential<span style="color: #FF0000; ">&amp;redirect_uri</span>=http://10.80.27.69:8183/<span style="color: #FF0000; ">&amp;response_type</span>=code<span style="color: #FF0000; ">&amp;scope</span>=openid</div></li><li>如果KEYCLOAK验证通过，则通知页面重导向回调的URL，并附上code=xxx，此code则是AUTHORIZATION_CODE<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http://10.80.27.69:8183/?session_state=2ad9ab98-6c39-43a8-872f-2112c27b74df<span style="color: #FF0000; ">&amp;code</span>=3f48ce19-58f9-45d9-8c09-30d492bf4b24.2ad9ab98-6c39-43a8-872f-2112c27b74df.bd7526ef-b1bf-447f-baef-b7dfd6f0df93</div></li><li>回调的URL对应的SERVELET，取得AUTHORIZATION_CODE，并加上client_id和client_secrect，调用KEYLOAK的取ACCESS_TOKEN的HTTP API，取得ACCESS_TOKEN，返回给页面<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http://10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/token<br />client_id=app-springboot-confidential<span style="color: #FF0000; ">&amp;client_secret</span>=3acf7692-49cb-4c45-9943-6f3dba512dae<span style="color: #FF0000; ">&amp;redirect_uri</span>=http://10.80.27.69:8183/<span style="color: #FF0000; ">&amp;grant_type</span>=authorization_code<span style="color: #FF0000; ">&amp;code</span>=cc7ac566-90f9-404e-b88e-fa28037b07d1.591311e1-5380-46a2-9363-834f17337922.bd7526ef-b1bf-447f-baef-b7dfd6f0df93</div></li><li>页面保存此ACCESS_TOKEN，就可以调用后台的各种API获取数据<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->{<br />&nbsp;&nbsp;&nbsp;&nbsp;"access_token":&nbsp;"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJleHAiOjE2MzQwMjA4ODksImlhdCI6MTYzNDAyMDU4OSwianRpIjoiNDAwOTQ4ZmQtMGU0MS00YWRjLTlhY2MtMzczZWM2NDVhNzM5IiwiaXNzIjoiaHR0cDovLzEwLjgwLjI3LjY5OjgxODAvYXV0aC9yZWFsbXMvcXVpY2tzdGFydCIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJkZGVkMDA2YS0xY2QxLTRjODUtOTQ1MS0wMjFlZmY3OTFiMmUiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJhcHAtc3ByaW5nYm9vdC1jb25maWRlbnRpYWwiLCJzZXNzaW9uX3N0YXRlIjoiYzRlN2QzYTgtMDg2My00OTAwLTkxZmEtMGExYmFmYmRlNGU3IiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYXBwLXNwcmluZ2Jvb3QtY29uZmlkZW50aWFsIjp7InJvbGVzIjpbInVtYV9wcm90ZWN0aW9uIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImNsaWVudElkIjoiYXBwLXNwcmluZ2Jvb3QtY29uZmlkZW50aWFsIiwiY2xpZW50SG9zdCI6IjEwLjEwLjIwLjU3IiwidXNlcl9uYW1lIjoic2VydmljZS1hY2NvdW50LWFwcC1zcHJpbmdib290LWNvbmZpZGVudGlhbCIsInByZWZlcnJlZF91c2VybmFtZSI6InNlcnZpY2UtYWNjb3VudC1hcHAtc3ByaW5nYm9vdC1jb25maWRlbnRpYWwiLCJjbGllbnRBZGRyZXNzIjoiMTAuMTAuMjAuNTcifQ.Ut6aZ6E1d4Esz0gRv2ubxdvrxmGvZLHHZepD5pnGxlqb_yZ4Q82TdGTG0iL4JJn2NH3QAU501dhzzuv6-OT9BUBKP-4ufyKv2DxSvt3GgdN30au5JsATHFyOWuuZGRBd3iWcynf9u3OJnSkHEnrIwRYatgndLzy8dy3AeqF12CI",<br />&nbsp;&nbsp;&nbsp;&nbsp;"expires_in":&nbsp;300,<br />&nbsp;&nbsp;&nbsp;&nbsp;"refresh_expires_in":&nbsp;600,<br />&nbsp;&nbsp;&nbsp;&nbsp;"refresh_token":&nbsp;"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI2MTlhMmJjOS0yMWIwLTRmNGMtODI4OC1kNTJmMjA3OWEzY2EifQ.eyJleHAiOjE2MzQwMjExODksImlhdCI6MTYzNDAyMDU4OSwianRpIjoiYTM0NTQ1MTYtMzc3NC00YmRlLTgzOTMtN2QyMTdkZjdkZmJkIiwiaXNzIjoiaHR0cDovLzEwLjgwLjI3LjY5OjgxODAvYXV0aC9yZWFsbXMvcXVpY2tzdGFydCIsImF1ZCI6Imh0dHA6Ly8xMC44MC4yNy42OTo4MTgwL2F1dGgvcmVhbG1zL3F1aWNrc3RhcnQiLCJzdWIiOiJkZGVkMDA2YS0xY2QxLTRjODUtOTQ1MS0wMjFlZmY3OTFiMmUiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoiYXBwLXNwcmluZ2Jvb3QtY29uZmlkZW50aWFsIiwic2Vzc2lvbl9zdGF0ZSI6ImM0ZTdkM2E4LTA4NjMtNDkwMC05MWZhLTBhMWJhZmJkZTRlNyIsInNjb3BlIjoicHJvZmlsZSBlbWFpbCJ9.QhjkJBGz5UvwBF7xHM7_V_yjfF0lrA_EWzAVdFf-BRI",<br />&nbsp;&nbsp;&nbsp;&nbsp;"token_type":&nbsp;"bearer",<br />&nbsp;&nbsp;&nbsp;&nbsp;"not-before-policy":&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;"session_state":&nbsp;"c4e7d3a8-0863-4900-91fa-0a1bafbde4e7",<br />&nbsp;&nbsp;&nbsp;&nbsp;"scope":&nbsp;"profile&nbsp;email"<br />}</div></li><li>这就是authorization_code流程</li></ul><br />后端服务：<br /><ul><li>如果是在一个API中要请求另外一个API的数据，不存在具体用户的情况</li><li>需提供如下参数：client_id、client_secrect和grant_type，且grant_type=client_credentials，调用KEYLOAK的取ACCESS_TOKEN的HTTP API，取得ACCESS_TOKEN<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http:<span style="color: #008000; ">//</span><span style="color: #008000; ">10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/token</span><span style="color: #008000; "><br /></span>client_id=app-springboot-confidential&amp;client_secret=3acf7692-49cb-4c45-9943-6f3dba512dae&amp;grant_type=client_credentials</div></li><li>再将此ACCESS_TOKEN以Bearer TOKEN的方式调用别的的API</li><li>这就是client_credentials流程</li></ul><br />验证Access Token和获取Token元信息：<br /><ul><li><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http:<span style="color: #008000; ">//</span><span style="color: #008000; ">10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/token/introspect</span><span style="color: #008000; "><br /></span>client_id=app-springboot-confidential&amp;client_secret=3acf7692-49cb-4c45-9943-6f3dba512dae</div></li><li>Access Token无效时返回：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->{<br />&nbsp;&nbsp;&nbsp;&nbsp;"active":&nbsp;<span style="color: #0000FF; ">false</span><br />}</div></li></ul><br />刷新Token：<br /><ul><li><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http:<span style="color: #008000; ">//</span><span style="color: #008000; ">10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/token</span><span style="color: #008000; "><br /></span>client_id=app-springboot-confidential&amp;client_secret=3acf7692-49cb-4c45-9943-6f3dba512dae&amp;grant_type=refresh_token&amp;refresh_token=asdfasd</div></li><li>返回<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->{<br />&nbsp;&nbsp;&nbsp;&nbsp;"access_token":&nbsp;"eyJhbGciOiJSUzI1NiIsIn",<br />&nbsp;&nbsp;&nbsp;&nbsp;"expires_in":&nbsp;300,<br />&nbsp;&nbsp;&nbsp;&nbsp;"refresh_expires_in":&nbsp;1800,<br />&nbsp;&nbsp;&nbsp;&nbsp;"refresh_token":&nbsp;"eyJhbGciOiJIUzI1NiIsInR5cCIgOi",<br />&nbsp;&nbsp;&nbsp;&nbsp;"token_type":&nbsp;"Bearer",<br />&nbsp;&nbsp;&nbsp;&nbsp;"not-before-policy":&nbsp;1610728470,<br />&nbsp;&nbsp;&nbsp;&nbsp;"session_state":&nbsp;"c1273eb5-f922-420c-b23a-854be9735c1d",<br />&nbsp;&nbsp;&nbsp;&nbsp;"scope":&nbsp;"profile&nbsp;email"<br />}</div></li></ul><br /><br /><br />Reference:<br /><a href="https://blog.csdn.net/nklinsirui/article/details/112706006" target="_blank">https://blog.csdn.net/nklinsirui/article/details/112706006</a><br /><br /><a href="https://www.baeldung.com/?s=keycloak" target="_blank">https://www.baeldung.com/?s=keycloak</a><br /><br /><a href="https://www.doag.org/formes/pubfiles/11143470/2019-NN-Sebastien_Blanc-Easily_Secure_your_Microservices_with_Keycloak-Praesentation.pdf" target="_blank">https://www.doag.org/formes/pubfiles/11143470/2019-NN-Sebastien_Blanc-Easily_Secure_your_Microservices_with_Keycloak-Praesentation.pdf</a><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/436009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-10-12 14:40 <a href="http://www.blogjava.net/paulwong/archive/2021/10/12/436009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING CLOUD JWT资源</title><link>http://www.blogjava.net/paulwong/archive/2017/03/24/432401.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 24 Mar 2017 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2017/03/24/432401.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/432401.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2017/03/24/432401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/432401.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/432401.html</trackback:ping><description><![CDATA[<br /><a href="https://github.com/thomas-kendall/trivia-microservices" target="_blank">https://github.com/thomas-kendall/trivia-microservices</a><br /><br /><br />一个Spring Boot， JWT，AugularJS接口安全验证的简单例子<br /><a href="http://blog.csdn.net/offbye/article/details/47607711" target="_blank">http://blog.csdn.net/offbye/article/details/47607711</a><br /><br /><br /><br /><a href="https://github.com/tuanngda/spring-boot-oauth2-demo" target="_blank">https://github.com/tuanngda/spring-boot-oauth2-demo</a><br /><br /><br />Spring Oauth2 with JWT Sample<br /><a href="http://www.tuicool.com/articles/EjUFZj7" target="_blank">http://www.tuicool.com/articles/EjUFZj7</a><br /><br /><br /><a href="http://stackoverflow.com/questions/38156213/spring-cloud-zuul-jwt-for-value-reference-tokens" target="_blank">http://stackoverflow.com/questions/38156213/spring-cloud-zuul-jwt-for-value-reference-tokens</a><img src ="http://www.blogjava.net/paulwong/aggbug/432401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2017-03-24 23:11 <a href="http://www.blogjava.net/paulwong/archive/2017/03/24/432401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解OAuth 2.0</title><link>http://www.blogjava.net/paulwong/archive/2015/08/07/426658.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 07 Aug 2015 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/08/07/426658.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/426658.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/08/07/426658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/426658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/426658.html</trackback:ping><description><![CDATA[<a href="https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html" target="_blank">https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html</a><br /><br /><a href="https://aaronparecki.com/oauth-2-simplified" target="_blank">https://aaronparecki.com/oauth-2-simplified</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/426658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-08-07 14:12 <a href="http://www.blogjava.net/paulwong/archive/2015/08/07/426658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>