<div dir="ltr">I was about to say &quot;I am using confidential&quot;.   Switching to public does indeed drop the need for preflight.  Learned something new :-)<div><br></div><div>Still want me to submit a PR for the refresh preflight?   Obviously using confidential doesn&#39;t add any security here, but I don&#39;t think supporting it can hurt either (and the JavaScript code supports it already.)</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Dec 2, 2014 at 8:24 AM, Bill Burke <span dir="ltr">&lt;<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">You mean the &quot;public&quot; application type.<br>
<div class="HOEnZb"><div class="h5"><br>
On 12/2/2014 10:10 AM, Stian Thorgersen wrote:<br>
&gt; The code-&gt;token and refresh token requests are being pre-flighted because there&#39;s a &#39;Authorization: Basic&#39; header in there. For a GWT app you should use the confidential application type, which doesn&#39;t require a secret.<br>
&gt;<br>
&gt; ----- Original Message -----<br>
&gt;&gt; From: &quot;Alain Penders&quot; &lt;<a href="mailto:alain@rexorient.com">alain@rexorient.com</a>&gt;<br>
&gt;&gt; To: &quot;Stian Thorgersen&quot; &lt;<a href="mailto:stian@redhat.com">stian@redhat.com</a>&gt;<br>
&gt;&gt; Cc: <a href="mailto:keycloak-dev@lists.jboss.org">keycloak-dev@lists.jboss.org</a><br>
&gt;&gt; Sent: Tuesday, 2 December, 2014 4:02:15 PM<br>
&gt;&gt; Subject: Re: [keycloak-dev] Fwd: Preflight for token refresh<br>
&gt;&gt;<br>
&gt;&gt; Not really.  It needs CORS for every URI it hits.  Refresh is a different<br>
&gt;&gt; URI from the code-&gt;token exchange one it uses initially.<br>
&gt;&gt;<br>
&gt;&gt; When Keycloak redirects back to the GWT app and the code is exchanged for<br>
&gt;&gt; the tokens, I see this in the Network trace:<br>
&gt;&gt;<br>
&gt;&gt; First an OPTIONS request:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;     1. Remote Address:<br>
&gt;&gt;     <a href="http://127.0.0.1:8080" target="_blank">127.0.0.1:8080</a><br>
&gt;&gt;     2. Request URL:<br>
&gt;&gt;     <a href="http://localhost:8080/auth/realms/GameSeeder/tokens/access/codes" target="_blank">http://localhost:8080/auth/realms/GameSeeder/tokens/access/codes</a><br>
&gt;&gt;     3. Request Method:<br>
&gt;&gt;     OPTIONS<br>
&gt;&gt;     4. Status Code:<br>
&gt;&gt;     200 OK<br>
&gt;&gt;     5. Request Headersview source<br>
&gt;&gt;        1. Accept:<br>
&gt;&gt;        */*<br>
&gt;&gt;        2. Accept-Encoding:<br>
&gt;&gt;        gzip, deflate, sdch<br>
&gt;&gt;        3. Accept-Language:<br>
&gt;&gt;        en-US,en;q=0.8<br>
&gt;&gt;        4. Access-Control-Request-Headers:<br>
&gt;&gt;        authorization, content-type<br>
&gt;&gt;        5. Access-Control-Request-Method:<br>
&gt;&gt;        POST<br>
&gt;&gt;        6. Connection:<br>
&gt;&gt;        keep-alive<br>
&gt;&gt;        7. Host:<br>
&gt;&gt;        localhost:8080<br>
&gt;&gt;        8. Origin:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888" target="_blank">http://127.0.0.1:8888</a><br>
&gt;&gt;        9. Referer:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888/Main.html" target="_blank">http://127.0.0.1:8888/Main.html</a><br>
&gt;&gt;        10. User-Agent:<br>
&gt;&gt;        Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like<br>
&gt;&gt;        Gecko) Chrome/39.0.2171.71 Safari/537.36<br>
&gt;&gt;        6. Response Headersview source<br>
&gt;&gt;        1. Access-Control-Allow-Credentials:<br>
&gt;&gt;        true<br>
&gt;&gt;        2. Access-Control-Allow-Headers:<br>
&gt;&gt;        Origin, Accept, X-Requested-With, Content-Type,<br>
&gt;&gt;        Access-Control-Request-Method, Access-Control-Request-Headers,<br>
&gt;&gt; Authorization<br>
&gt;&gt;        3. Access-Control-Allow-Methods:<br>
&gt;&gt;        GET, HEAD, OPTIONS<br>
&gt;&gt;        4. Access-Control-Allow-Origin:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888" target="_blank">http://127.0.0.1:8888</a><br>
&gt;&gt;        5. Access-Control-Max-Age:<br>
&gt;&gt;        3600<br>
&gt;&gt;        6. Connection:<br>
&gt;&gt;        keep-alive<br>
&gt;&gt;        7. Content-Length:<br>
&gt;&gt;        0<br>
&gt;&gt;        8. Date:<br>
&gt;&gt;        Tue, 02 Dec 2014 14:51:47 GMT<br>
&gt;&gt;        9. Server:<br>
&gt;&gt;        WildFly/8<br>
&gt;&gt;        10. X-Powered-By:<br>
&gt;&gt;        Undertow/1<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Then the actual code exchange request:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;     1. Remote Address:<br>
&gt;&gt;     <a href="http://127.0.0.1:8080" target="_blank">127.0.0.1:8080</a><br>
&gt;&gt;     2. Request URL:<br>
&gt;&gt;     <a href="http://localhost:8080/auth/realms/GameSeeder/tokens/access/codes" target="_blank">http://localhost:8080/auth/realms/GameSeeder/tokens/access/codes</a><br>
&gt;&gt;     3. Request Method:<br>
&gt;&gt;     POST<br>
&gt;&gt;     4. Status Code:<br>
&gt;&gt;     200 OK<br>
&gt;&gt;     5. Request Headersview source<br>
&gt;&gt;        1. Accept:<br>
&gt;&gt;        */*<br>
&gt;&gt;        2. Accept-Encoding:<br>
&gt;&gt;        gzip, deflate<br>
&gt;&gt;        3. Accept-Language:<br>
&gt;&gt;        en-US,en;q=0.8<br>
&gt;&gt;        4. Authorization:<br>
&gt;&gt;        Basic R2FtZVNlZWRlcjoyYTczYTQ0Yi1lMGFhLTRiMTYtODk2OC1hY2YwZTVlMGVlNTk=<br>
&gt;&gt;        5. Connection:<br>
&gt;&gt;        keep-alive<br>
&gt;&gt;        6. Content-Length:<br>
&gt;&gt;        85<br>
&gt;&gt;        7. Content-type:<br>
&gt;&gt;        application/x-www-form-urlencoded<br>
&gt;&gt;        8. Cookie:<br>
&gt;&gt;        KEYCLOAK_IDENTITY=eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI5NTA4ZTg2Yi04ZjdhLTRmN2UtOWYzOC1jMTFhMDdkNjUyOWMiLCJleHAiOjE0MjAxMjM5MDYsIm5iZiI6MCwiaWF0IjoxNDE3NTMxOTA2LCJpc3MiOiJHYW1lU2VlZGVyIiwic3ViIjoiOTY0ZjkwNWMtZTg2ZC00NDUzLWE3MzItYWVlMDE5NGY5YTIwIiwic2Vzc2lvbl9zdGF0ZSI6ImVjODE0NjcyLTFhOWYtNDM1ZS04YjU4LTU4ZmI4MDNiMDZkYSIsInJlc291cmNlX2FjY2VzcyI6e319.LiS51MggFZVPJ-TUlcYejPD7x6pJvgdOYCLrHV8LKiIP6BGZzS7D4W0t3xsXeKxqBr-h3cSaY_BqWKRl4RGn67SHuWvoDRrS6xKPZuWPQ08NS_iQVrIKGOATtGF2VFMutnroa4Y_UNmi5T2gZFc-wphRWRV5YG-x-DGAqd4h42U;<br>
&gt;&gt;        KEYCLOAK_SESSION=GameSeeder/964f905c-e86d-4453-a732-aee0194f9a20/ec814672-1a9f-435e-8b58-58fb803b06da;<br>
&gt;&gt;        KEYCLOAK_REMEMBER_ME=username:alain<br>
&gt;&gt;        9. Host:<br>
&gt;&gt;        localhost:8080<br>
&gt;&gt;        10. Origin:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888" target="_blank">http://127.0.0.1:8888</a><br>
&gt;&gt;        11. Referer:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888/Main.html" target="_blank">http://127.0.0.1:8888/Main.html</a><br>
&gt;&gt;        12. User-Agent:<br>
&gt;&gt;        Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like<br>
&gt;&gt;        Gecko) Chrome/39.0.2171.71 Safari/537.36<br>
&gt;&gt;        6. Form Dataview sourceview URL encoded<br>
&gt;&gt;        1. code:<br>
&gt;&gt;<br>
&gt;&gt;        sCnqEAuF8YuobscjJnCKdGu6xqnZ-CsqT5prXc5i7os.b9cda44e-50d6-49dd-b30a-dee68b530662<br>
&gt;&gt;        7. Response Headersview source<br>
&gt;&gt;        1. Access-Control-Allow-Credentials:<br>
&gt;&gt;        true<br>
&gt;&gt;        2. Access-Control-Allow-Headers:<br>
&gt;&gt;        Origin, Accept, X-Requested-With, Content-Type,<br>
&gt;&gt;        Access-Control-Request-Method, Access-Control-Request-Headers,<br>
&gt;&gt; Authorization<br>
&gt;&gt;        3. Access-Control-Allow-Methods:<br>
&gt;&gt;        POST<br>
&gt;&gt;        4. Access-Control-Allow-Origin:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888" target="_blank">http://127.0.0.1:8888</a><br>
&gt;&gt;        5. Access-Control-Expose-Headers:<br>
&gt;&gt;        Access-Control-Allow-Methods<br>
&gt;&gt;        6. Access-Control-Max-Age:<br>
&gt;&gt;        3600<br>
&gt;&gt;        7. Connection:<br>
&gt;&gt;        keep-alive<br>
&gt;&gt;        8. Content-Type:<br>
&gt;&gt;        application/json<br>
&gt;&gt;        9. Date:<br>
&gt;&gt;        Tue, 02 Dec 2014 14:51:47 GMT<br>
&gt;&gt;        10. Server:<br>
&gt;&gt;        WildFly/8<br>
&gt;&gt;        11. Transfer-Encoding:<br>
&gt;&gt;        chunked<br>
&gt;&gt;        12. X-Powered-By:<br>
&gt;&gt;        Undertow/1<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Now I wait 5+ minutes, forcing keycloak to use the refresh token. Since<br>
&gt;&gt; this uses the refresh URI for the first time, Chrome performs a preflight<br>
&gt;&gt; check:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;     1. Remote Address:<br>
&gt;&gt;     <a href="http://127.0.0.1:8080" target="_blank">127.0.0.1:8080</a><br>
&gt;&gt;     2. Request URL:<br>
&gt;&gt;     <a href="http://localhost:8080/auth/realms/GameSeeder/tokens/refresh" target="_blank">http://localhost:8080/auth/realms/GameSeeder/tokens/refresh</a><br>
&gt;&gt;     3. Request Method:<br>
&gt;&gt;     OPTIONS<br>
&gt;&gt;     4. Status Code:<br>
&gt;&gt;     200 OK<br>
&gt;&gt;     5. Request Headersview source<br>
&gt;&gt;        1. Accept:<br>
&gt;&gt;        */*<br>
&gt;&gt;        2. Accept-Encoding:<br>
&gt;&gt;        gzip, deflate, sdch<br>
&gt;&gt;        3. Accept-Language:<br>
&gt;&gt;        en-US,en;q=0.8<br>
&gt;&gt;        4. Access-Control-Request-Headers:<br>
&gt;&gt;        authorization, content-type<br>
&gt;&gt;        5. Access-Control-Request-Method:<br>
&gt;&gt;        POST<br>
&gt;&gt;        6. Connection:<br>
&gt;&gt;        keep-alive<br>
&gt;&gt;        7. Host:<br>
&gt;&gt;        localhost:8080<br>
&gt;&gt;        8. Origin:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888" target="_blank">http://127.0.0.1:8888</a><br>
&gt;&gt;        9. Referer:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888/Main.html" target="_blank">http://127.0.0.1:8888/Main.html</a><br>
&gt;&gt;        10. User-Agent:<br>
&gt;&gt;        Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like<br>
&gt;&gt;        Gecko) Chrome/39.0.2171.71 Safari/537.36<br>
&gt;&gt;        6. Response Headersview source<br>
&gt;&gt;        1. Access-Control-Allow-Credentials:<br>
&gt;&gt;        true<br>
&gt;&gt;        2. Access-Control-Allow-Headers:<br>
&gt;&gt;        Origin, Accept, X-Requested-With, Content-Type,<br>
&gt;&gt;        Access-Control-Request-Method, Access-Control-Request-Headers,<br>
&gt;&gt; Authorization<br>
&gt;&gt;        3. Access-Control-Allow-Methods:<br>
&gt;&gt;        GET, HEAD, OPTIONS<br>
&gt;&gt;        4. Access-Control-Allow-Origin:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888" target="_blank">http://127.0.0.1:8888</a><br>
&gt;&gt;        5. Access-Control-Max-Age:<br>
&gt;&gt;        3600<br>
&gt;&gt;        6. Connection:<br>
&gt;&gt;        keep-alive<br>
&gt;&gt;        7. Content-Length:<br>
&gt;&gt;        0<br>
&gt;&gt;        8. Date:<br>
&gt;&gt;        Tue, 02 Dec 2014 15:00:32 GMT<br>
&gt;&gt;        9. Server:<br>
&gt;&gt;        WildFly/8<br>
&gt;&gt;        10. X-Powered-By:<br>
&gt;&gt;        Undertow/1<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Followed by the actual refresh:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;     1. Remote Address:<br>
&gt;&gt;     <a href="http://127.0.0.1:8080" target="_blank">127.0.0.1:8080</a><br>
&gt;&gt;     2. Request URL:<br>
&gt;&gt;     <a href="http://localhost:8080/auth/realms/GameSeeder/tokens/refresh" target="_blank">http://localhost:8080/auth/realms/GameSeeder/tokens/refresh</a><br>
&gt;&gt;     3. Request Method:<br>
&gt;&gt;     POST<br>
&gt;&gt;     4. Status Code:<br>
&gt;&gt;     200 OK<br>
&gt;&gt;     5. Request Headersview source<br>
&gt;&gt;        1. Accept:<br>
&gt;&gt;        */*<br>
&gt;&gt;        2. Accept-Encoding:<br>
&gt;&gt;        gzip, deflate<br>
&gt;&gt;        3. Accept-Language:<br>
&gt;&gt;        en-US,en;q=0.8<br>
&gt;&gt;        4. Authorization:<br>
&gt;&gt;        Basic R2FtZVNlZWRlcjoyYTczYTQ0Yi1lMGFhLTRiMTYtODk2OC1hY2YwZTVlMGVlNTk=<br>
&gt;&gt;        5. Connection:<br>
&gt;&gt;        keep-alive<br>
&gt;&gt;        6. Content-Length:<br>
&gt;&gt;        699<br>
&gt;&gt;        7. Content-type:<br>
&gt;&gt;        application/x-www-form-urlencoded<br>
&gt;&gt;        8. Host:<br>
&gt;&gt;        localhost:8080<br>
&gt;&gt;        9. Origin:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888" target="_blank">http://127.0.0.1:8888</a><br>
&gt;&gt;        10. Referer:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888/Main.html" target="_blank">http://127.0.0.1:8888/Main.html</a><br>
&gt;&gt;        11. User-Agent:<br>
&gt;&gt;        Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like<br>
&gt;&gt;        Gecko) Chrome/39.0.2171.71 Safari/537.36<br>
&gt;&gt;        6. Form Dataview sourceview URL encoded<br>
&gt;&gt;        1. grant_type:<br>
&gt;&gt;        refresh_token<br>
&gt;&gt;        2. refresh_token:<br>
&gt;&gt;<br>
&gt;&gt;        eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiJjMWZlOGUyNS0yNTlkLTQwYjYtOGFmMS0yMDU0Y2EwMTRkYWEiLCJleHAiOjE0MTc1MzkxMDcsIm5iZiI6MCwiaWF0IjoxNDE3NTMxOTA3LCJpc3MiOiJHYW1lU2VlZGVyIiwic3ViIjoiOTY0ZjkwNWMtZTg2ZC00NDUzLWE3MzItYWVlMDE5NGY5YTIwIiwidHlwIjoiUkVGUkVTSCIsImF6cCI6IkdhbWVTZWVkZXIiLCJzZXNzaW9uX3N0YXRlIjoiZWM4MTQ2NzItMWE5Zi00MzVlLThiNTgtNThmYjgwM2IwNmRhIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbInVzZXIiXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbInZpZXctcHJvZmlsZSIsIm1hbmFnZS1hY2NvdW50Il19fX0.HlAXTyosQ4SHL2WyqRVMDEwN2TXNQyqTKE8PRkbhnbhjJPq4alDP2mCBH2RV3a5KPDCTj1-H-bnKpebrV8fOWNVrQCCL5NN6t7KEYLH1hA75ak_xWSUNzz7s_ZlW9AVucuMCFk1-bXnDaQOilU9JOS2yomQYa4PvexmrbzEJ5Bs<br>
&gt;&gt;        7. Response Headersview source<br>
&gt;&gt;        1. Access-Control-Allow-Credentials:<br>
&gt;&gt;        true<br>
&gt;&gt;        2. Access-Control-Allow-Headers:<br>
&gt;&gt;        Origin, Accept, X-Requested-With, Content-Type,<br>
&gt;&gt;        Access-Control-Request-Method, Access-Control-Request-Headers,<br>
&gt;&gt; Authorization<br>
&gt;&gt;        3. Access-Control-Allow-Methods:<br>
&gt;&gt;        POST<br>
&gt;&gt;        4. Access-Control-Allow-Origin:<br>
&gt;&gt;        <a href="http://127.0.0.1:8888" target="_blank">http://127.0.0.1:8888</a><br>
&gt;&gt;        5. Access-Control-Expose-Headers:<br>
&gt;&gt;        Access-Control-Allow-Methods<br>
&gt;&gt;        6. Access-Control-Max-Age:<br>
&gt;&gt;        3600<br>
&gt;&gt;        7. Connection:<br>
&gt;&gt;        keep-alive<br>
&gt;&gt;        8. Content-Type:<br>
&gt;&gt;        application/json<br>
&gt;&gt;        9. Date:<br>
&gt;&gt;        Tue, 02 Dec 2014 15:00:32 GMT<br>
&gt;&gt;        10. Server:<br>
&gt;&gt;        WildFly/8<br>
&gt;&gt;        11. Transfer-Encoding:<br>
&gt;&gt;        chunked<br>
&gt;&gt;        12. X-Powered-By:<br>
&gt;&gt;        Undertow/1<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Tue, Dec 2, 2014 at 7:49 AM, Stian Thorgersen &lt;<a href="mailto:stian@redhat.com">stian@redhat.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; ----- Original Message -----<br>
&gt;&gt;&gt;&gt; From: &quot;Alain Penders&quot; &lt;<a href="mailto:alain@rexorient.com">alain@rexorient.com</a>&gt;<br>
&gt;&gt;&gt;&gt; To: &quot;Stian Thorgersen&quot; &lt;<a href="mailto:stian@redhat.com">stian@redhat.com</a>&gt;<br>
&gt;&gt;&gt;&gt; Cc: <a href="mailto:keycloak-dev@lists.jboss.org">keycloak-dev@lists.jboss.org</a><br>
&gt;&gt;&gt;&gt; Sent: Tuesday, 2 December, 2014 3:43:13 PM<br>
&gt;&gt;&gt;&gt; Subject: Re: [keycloak-dev] Fwd: Preflight for token refresh<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; I&#39;m testing my UI using GWTs Super Dev Mode, which means its origin is<br>
&gt;&gt;&gt; set<br>
&gt;&gt;&gt;&gt; to <a href="http://127.0.0.1:8888" target="_blank">http://127.0.0.1:8888</a>.    Keycloak runs on <a href="http://127.0.0.1:8080/auth" target="_blank">http://127.0.0.1:8080/auth</a><br>
&gt;&gt;&gt; .<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Yes, that requires CORS, but doesn&#39;t necessarily require a PREFLIGHT<br>
&gt;&gt;&gt; request. My guess is that &quot;GWTs Super Dev Mode&quot; sets some custom headers on<br>
&gt;&gt;&gt; all requests.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; On Tue, Dec 2, 2014 at 7:32 AM, Stian Thorgersen &lt;<a href="mailto:stian@redhat.com">stian@redhat.com</a>&gt;<br>
&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; It&#39;s the correct approach to add the preflight. Please send a PR and<br>
&gt;&gt;&gt; we&#39;ll<br>
&gt;&gt;&gt;&gt;&gt; merge it.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Out of curiosity do you know why it&#39;s sending a preflight in your app?<br>
&gt;&gt;&gt; It<br>
&gt;&gt;&gt;&gt;&gt; doesn&#39;t when I test it out here, which AFAIK is correct according to<br>
&gt;&gt;&gt; spec<br>
&gt;&gt;&gt;&gt;&gt; (content-type is application/x-www-form-urlencoded and there&#39;s no<br>
&gt;&gt;&gt; custom<br>
&gt;&gt;&gt;&gt;&gt; headers set).<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; ----- Original Message -----<br>
&gt;&gt;&gt;&gt;&gt;&gt; From: &quot;Alain Penders&quot; &lt;<a href="mailto:alain@rexorient.com">alain@rexorient.com</a>&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; To: <a href="mailto:keycloak-dev@lists.jboss.org">keycloak-dev@lists.jboss.org</a><br>
&gt;&gt;&gt;&gt;&gt;&gt; Sent: Tuesday, 2 December, 2014 3:04:50 PM<br>
&gt;&gt;&gt;&gt;&gt;&gt; Subject: [keycloak-dev] Fwd: Preflight for token refresh<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Hi all,<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; I&#39;m building a new app using GWT 2.7 using the Keycloak javascript<br>
&gt;&gt;&gt;&gt;&gt; adapter<br>
&gt;&gt;&gt;&gt;&gt;&gt; and GWT jsInterop. This works extremely well.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; The problem I ran into is if I walk away for 5 minutes and then try<br>
&gt;&gt;&gt; to do<br>
&gt;&gt;&gt;&gt;&gt;&gt; something, the token refresh fails on preflight. As shown in the<br>
&gt;&gt;&gt;&gt;&gt;&gt; documentation, I call keycloak.updateToken(30) to refresh the base<br>
&gt;&gt;&gt; token<br>
&gt;&gt;&gt;&gt;&gt; in<br>
&gt;&gt;&gt;&gt;&gt;&gt; case it has expired. Since in this case it has indeed expired,<br>
&gt;&gt;&gt; keycloak<br>
&gt;&gt;&gt;&gt;&gt;&gt; makes a call to /auth/realms/&lt;myrealm&gt;/tokens/refresh. The OPTIONS<br>
&gt;&gt;&gt; call<br>
&gt;&gt;&gt;&gt;&gt; to<br>
&gt;&gt;&gt;&gt;&gt;&gt; this location doesn&#39;t contain the Accept headers, and my app ends up<br>
&gt;&gt;&gt;&gt;&gt; dead in<br>
&gt;&gt;&gt;&gt;&gt;&gt; the water.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; To fix this, I added the following code to OpenIDConnectService:<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; /**<br>
&gt;&gt;&gt;&gt;&gt;&gt; * CORS preflight path for refresh token requests<br>
&gt;&gt;&gt;&gt;&gt;&gt; *<br>
&gt;&gt;&gt;&gt;&gt;&gt; * @return<br>
&gt;&gt;&gt;&gt;&gt;&gt; */<br>
&gt;&gt;&gt;&gt;&gt;&gt; @Path(&quot;refresh&quot;)<br>
&gt;&gt;&gt;&gt;&gt;&gt; @OPTIONS<br>
&gt;&gt;&gt;&gt;&gt;&gt; @Produces(MediaType.APPLICATION_JSON)<br>
&gt;&gt;&gt;&gt;&gt;&gt; public Response refreshAccessTokenPreflight() {<br>
&gt;&gt;&gt;&gt;&gt;&gt; if (logger.isDebugEnabled()) {<br>
&gt;&gt;&gt;&gt;&gt;&gt; logger.debugv(&quot;cors request from: {0}&quot;,<br>
&gt;&gt;&gt;&gt;&gt;&gt; request.getHttpHeaders().getRequestHeaders().getFirst(&quot;Origin&quot;));<br>
&gt;&gt;&gt;&gt;&gt;&gt; }<br>
&gt;&gt;&gt;&gt;&gt;&gt; return Cors.add(request, Response.ok()).auth().preflight().build();<br>
&gt;&gt;&gt;&gt;&gt;&gt; }<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; If this wasn&#39;t the correct solution for my problem, I&#39;d enjoy hearing<br>
&gt;&gt;&gt;&gt;&gt; where I<br>
&gt;&gt;&gt;&gt;&gt;&gt; went wrong.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Thanks,<br>
&gt;&gt;&gt;&gt;&gt;&gt; Alain<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt;&gt;&gt; keycloak-dev mailing list<br>
&gt;&gt;&gt;&gt;&gt;&gt; <a href="mailto:keycloak-dev@lists.jboss.org">keycloak-dev@lists.jboss.org</a><br>
&gt;&gt;&gt;&gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/keycloak-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-dev</a><br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt; _______________________________________________<br>
&gt; keycloak-dev mailing list<br>
&gt; <a href="mailto:keycloak-dev@lists.jboss.org">keycloak-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/keycloak-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-dev</a><br>
&gt;<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
Bill Burke<br>
JBoss, a division of Red Hat<br>
<a href="http://bill.burkecentral.com" target="_blank">http://bill.burkecentral.com</a><br>
</font></span><div class="HOEnZb"><div class="h5">_______________________________________________<br>
keycloak-dev mailing list<br>
<a href="mailto:keycloak-dev@lists.jboss.org">keycloak-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/keycloak-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-dev</a><br>
</div></div></blockquote></div><br></div>