Author: buildbot
Date: Sun Jan 18 22:46:50 2015
New Revision: 936695

Log:
Production update by buildbot for cxf

Added:
    websites/production/cxf/content/docs/jax-rs-jose.html
Modified:
    websites/production/cxf/content/cache/docs.pageCache
    websites/production/cxf/content/docs/jax-rs-oauth2.html

Modified: websites/production/cxf/content/cache/docs.pageCache
==============================================================================
Binary files - no diff available.

Added: websites/production/cxf/content/docs/jax-rs-jose.html
==============================================================================
--- websites/production/cxf/content/docs/jax-rs-jose.html (added)
+++ websites/production/cxf/content/docs/jax-rs-jose.html Sun Jan 18 22:46:50 
2015
@@ -0,0 +1,182 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<html>
+  <head>
+
+<link type="text/css" rel="stylesheet" href="/resources/site.css">
+<script src='/resources/space.js'></script>
+
+<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
+<meta name="keywords" content="business integration, EAI, SOA, Service 
Oriented Architecture, web services, SOAP, JBI, JMS, WSDL, XML, EDI, Electronic 
Data Interchange, standards support, integration standards, application 
integration, middleware, software, solutions, services, CXF, open source">
+<meta name="description" content="Apache CXF, Services Framework - JAX-RS 
JOSE">
+
+
+<link type="text/css" rel="stylesheet" 
href="/resources/highlighter/styles/shCoreCXF.css">
+<link type="text/css" rel="stylesheet" 
href="/resources/highlighter/styles/shThemeCXF.css">
+
+<script src='/resources/highlighter/scripts/shCore.js'></script>
+<script src='/resources/highlighter/scripts/shBrushXml.js'></script>
+<script>
+  SyntaxHighlighter.defaults['toolbar'] = false;
+  SyntaxHighlighter.all();
+</script>
+
+
+    <title>
+Apache CXF -- JAX-RS JOSE
+    </title>
+  </head>
+<body onload="init()">
+
+
+<table width="100%" cellpadding="0" cellspacing="0">
+  <tr>
+    <td id="cell-0-0" colspan="2">&nbsp;</td>
+    <td id="cell-0-1">&nbsp;</td>
+    <td id="cell-0-2" colspan="2">&nbsp;</td>
+  </tr>
+  <tr>
+    <td id="cell-1-0">&nbsp;</td>
+    <td id="cell-1-1">&nbsp;</td>
+    <td id="cell-1-2">
+      <!-- Banner -->
+<div class="banner" id="banner"><div><table border="0" cellpadding="0" 
cellspacing="0" width="100%"><tr><td align="left" colspan="1" nowrap>
+<a shape="rect" href="http://cxf.apache.org/"; title="Apache CXF"><span 
style="font-weight: bold; font-size: 170%; color: white">Apache CXF</span></a>
+</td><td align="right" colspan="1" nowrap>
+<a shape="rect" href="http://www.apache.org/"; title="The Apache Sofware 
Foundation"><img border="0" alt="ASF Logo" 
src="http://cxf.apache.org/images/asf-logo.png";></a>
+</td></tr></table></div></div>
+      <!-- Banner -->
+      <div id="top-menu">
+        <table border="0" cellpadding="1" cellspacing="0" width="100%">
+          <tr>
+            <td>
+              <div align="left">
+                <!-- Breadcrumbs -->
+<a href="index.html">Index</a>&nbsp;&gt;&nbsp;<a 
href="restful-services.html">RESTful Services</a>&nbsp;&gt;&nbsp;<a 
href="jax-rs.html">JAX-RS</a>&nbsp;&gt;&nbsp;<a 
href="jax-rs-oauth2.html">JAX-RS OAuth2</a>&nbsp;&gt;&nbsp;<a 
href="jax-rs-jose.html">JAX-RS JOSE</a>
+                <!-- Breadcrumbs -->
+              </div>
+            </td>
+            <td>
+              <div align="right">
+                <!-- Quicklinks -->
+<div id="quicklinks"><p><a shape="rect" 
href="http://cxf.apache.org/download.html";>Download</a> | <a shape="rect" 
href="http://cxf.apache.org/docs/index.html";>Documentation</a></p></div>
+                <!-- Quicklinks -->
+              </div>
+            </td>
+          </tr>
+        </table>
+      </div>
+    </td>
+    <td id="cell-1-3">&nbsp;</td>
+    <td id="cell-1-4">&nbsp;</td>
+  </tr>
+  <tr>
+    <td id="cell-2-0" colspan="2">&nbsp;</td>
+    <td id="cell-2-1">
+      <table>
+        <tr valign="top">
+          <td height="100%">
+            <div id="wrapper-menu-page-right">
+              <div id="wrapper-menu-page-top">
+                <div id="wrapper-menu-page-bottom">
+                  <div id="menu-page">
+                    <!-- NavigationBar -->
+<div id="navigation"><ul class="alternate"><li><a shape="rect" 
href="overview.html">Overview</a></li><li><a shape="rect" 
href="how-tos.html">How-Tos</a></li><li><a shape="rect" 
href="frontends.html">Frontends</a></li><li><a shape="rect" 
href="databindings.html">DataBindings</a></li><li><a shape="rect" 
href="transports.html">Transports</a></li><li><a shape="rect" 
href="configuration.html">Configuration</a></li><li><a shape="rect" 
href="debugging-and-logging.html">Debugging and Logging</a></li><li><a 
shape="rect" href="tools.html">Tools</a></li><li><a shape="rect" 
href="restful-services.html">RESTful Services</a></li><li><a shape="rect" 
href="wsdl-bindings.html">WSDL Bindings</a></li><li><a shape="rect" 
href="service-routing.html">Service Routing</a></li><li><a shape="rect" 
href="dynamic-languages.html">Dynamic Languages</a></li><li><a shape="rect" 
href="ws-support.html">WS-* Support</a></li><li><a shape="rect" 
href="advanced-integration.html">Advanced Integration</a></li><li><a shape
 ="rect" href="deployment.html">Deployment</a></li><li><a shape="rect" 
href="schemas-and-namespaces.html">Use of Schemas and 
Namespaces</a></li></ul><hr><ul 
class="alternate"><li><p>Search</p></li></ul><form 
enctype="application/x-www-form-urlencoded" method="get" id="cse-search-box" 
action="http://www.google.com/cse";>
+  <div>
+    <input type="hidden" name="cx" value="002890367768291051730:o99qiwa09y4">
+    <input type="hidden" name="ie" value="UTF-8">
+    <input type="text" name="q" size="21">
+    <input type="submit" name="sa" value="Search">
+  </div>
+</form>
+<script type="text/javascript" 
src="http://www.google.com/cse/brand?form=cse-search-box&amp;lang=en";></script><hr><ul
 class="alternate"><li><a shape="rect" 
href="http://cxf.apache.org/javadoc/latest/";>API 2.x (Javadoc)</a></li><li><a 
shape="rect" href="http://cxf.apache.org/javadoc/latest-3.0.x/";>API 3.x 
(Javadoc)</a></li><li><a shape="rect" href="http://cxf.apache.org/";>CXF 
Website</a></li></ul></div>
+                    <!-- NavigationBar -->
+                  </div>
+              </div>
+            </div>
+          </div>
+         </td>
+         <td height="100%">
+           <!-- Content -->
+           <div class="wiki-content">
+<div id="ConfluenceContent"><p>&#160;</p><p><style 
type="text/css">/*<![CDATA[*/
+div.rbtoc1421621184755 {padding: 0px;}
+div.rbtoc1421621184755 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1421621184755 li {margin-left: 0px;padding-left: 0px;}
+
+/*]]>*/</style></p><div class="toc-macro rbtoc1421621184755">
+<ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-Introduction">Introduction</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-MavenDependencies">Maven Dependencies</a></li><li><a 
shape="rect" href="#JAX-RSJOSE-JoseOverview">Jose Overview</a>
+<ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-JWAAlgorithms">JWA Algorithms</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JWKKeys">JWK Keys</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JWSSignature">JWS Signature</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JSONEncryption">JSON Encryption</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JSONWebTokens">JSON Web Tokens</a></li></ul>
+</li><li><a shape="rect" href="#JAX-RSJOSE-JAX-RSJoseFilters">JAX-RS Jose 
Filters</a></li><li><a shape="rect" href="#JAX-RSJOSE-OAuth2andJose">OAuth2 and 
Jose</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-Third-PartyAlternatives">Third-Party 
Alternatives</a></li></ul>
+</div><h1 id="JAX-RSJOSE-Introduction">Introduction</h1><p>CXF 3.0.x 
implements <a shape="rect" class="external-link" 
href="https://datatracker.ietf.org/wg/jose/documents/"; 
rel="nofollow">JOSE</a>.</p><h1 id="JAX-RSJOSE-MavenDependencies">Maven 
Dependencies</h1><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
+<script class="theme: Default; brush: xml; gutter: false" 
type="syntaxhighlighter"><![CDATA[&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
+  &lt;artifactId&gt;cxf-rt-rs-security-jose&lt;/artifactId&gt;
+  &lt;version&gt;3.1.0&lt;/version&gt;
+&lt;/dependency&gt;
+]]></script>
+</div></div><p>&#160;</p><h1 id="JAX-RSJOSE-JoseOverview">Jose 
Overview</h1><h2 id="JAX-RSJOSE-JWAAlgorithms">JWA Algorithms</h2><h2 
id="JAX-RSJOSE-JWKKeys">JWK Keys</h2><h2 id="JAX-RSJOSE-JWSSignature">JWS 
Signature</h2><p>&#160;</p><h2 id="JAX-RSJOSE-JSONEncryption">JSON 
Encryption</h2><h2 id="JAX-RSJOSE-JSONWebTokens">JSON Web 
Tokens</h2><p>&#160;</p><h1 id="JAX-RSJOSE-JAX-RSJoseFilters">JAX-RS Jose 
Filters</h1><p>&#160;</p><h1 id="JAX-RSJOSE-OAuth2andJose">OAuth2 and 
Jose</h1><p>&#160;</p><h1 id="JAX-RSJOSE-Third-PartyAlternatives">Third-Party 
Alternatives</h1><p>Jose4J. Etc.</p><p>&#160;</p></div>
+           </div>
+           <!-- Content -->
+         </td>
+        </tr>
+      </table>
+   </td>
+   <td id="cell-2-2" colspan="2">&nbsp;</td>
+  </tr>
+  <tr>
+   <td id="cell-3-0">&nbsp;</td>
+   <td id="cell-3-1">&nbsp;</td>
+   <td id="cell-3-2">
+     <div id="footer">
+       <!-- Footer -->
+       <div id="site-footer">
+         <a href="http://cxf.apache.org/privacy-policy.html";>Privacy 
Policy</a> - 
+         (<a 
href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=41812304";>edit
 page</a>) 
+        (<a 
href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=41812304&amp;showComments=true&amp;showCommentArea=true#addcomment";>add
 comment</a>)<br>
+       Apache CXF, CXF, Apache, the Apache feather logo are trademarks of The 
Apache Software Foundation.<br>
+        All other marks mentioned may be trademarks or registered trademarks 
of their respective owners.
+       </div>
+       <!-- Footer -->
+     </div>
+   </td>
+   <td id="cell-3-3">&nbsp;</td>
+   <td id="cell-3-4">&nbsp;</td>
+  </tr>
+  <tr>
+    <td id="cell-4-0" colspan="2">&nbsp;</td>
+    <td id="cell-4-1">&nbsp;</td>
+    <td id="cell-4-2" colspan="2">&nbsp;</td>
+  </tr>
+</table>
+
+<script type="text/javascript">
+var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl."; : 
"http://www.";);
+document.write(unescape("%3Cscript src='" + gaJsHost + 
"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<script type="text/javascript">
+try {
+var pageTracker = _gat._getTracker("UA-4458903-1");
+pageTracker._trackPageview();
+} catch(err) {}</script>
+
+</body>
+</html>
+

Modified: websites/production/cxf/content/docs/jax-rs-oauth2.html
==============================================================================
--- websites/production/cxf/content/docs/jax-rs-oauth2.html (original)
+++ websites/production/cxf/content/docs/jax-rs-oauth2.html Sun Jan 18 22:46:50 
2015
@@ -118,11 +118,11 @@ Apache CXF -- JAX-RS OAuth2
            <!-- Content -->
            <div class="wiki-content">
 <div id="ConfluenceContent"><h1 id="JAX-RSOAuth2-JAX-RS:OAuth2">JAX-RS: 
OAuth2</h1><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1421588806512 {padding: 0px;}
-div.rbtoc1421588806512 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1421588806512 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1421621185099 {padding: 0px;}
+div.rbtoc1421621185099 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1421621185099 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1421588806512">
+/*]]>*/</style></p><div class="toc-macro rbtoc1421621185099">
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSOAuth2-JAX-RS:OAuth2">JAX-RS: OAuth2</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-Introduction">Introduction</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-Mavendependencies">Maven dependencies</a></li><li><a 
shape="rect" href="#JAX-RSOAuth2-ClientRegistration">Client 
Registration</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-DevelopingOAuth2Servers">Developing OAuth2 Servers</a>
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSOAuth2-AuthorizationService">Authorization Service</a>
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSOAuth2-HowtocreateAuthorizationView">How to create Authorization 
View</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-EndUserNameinAuthorizationForm">EndUser Name in 
Authorization Form</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-PublicClients(Devices)">Public Clients (Devices)</a>
@@ -143,7 +143,7 @@ div.rbtoc1421588806512 li {margin-left:
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSOAuth2-MultipleFactorVerification">Multiple Factor 
Verification</a></li></ul>
 </li><li><a shape="rect" 
href="#JAX-RSOAuth2-CustomizingEndUserSubjectinitialization">Customizing End 
User Subject initialization</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-ProtectingresourceswithOAuthfilters">Protecting resources 
with OAuth filters</a>
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSOAuth2-OAuth2tokensandSOAPendpoints">OAuth2 tokens and SOAP 
endpoints</a></li></ul>
-</li><li><a shape="rect" href="#JAX-RSOAuth2-Howtogettheuserloginname">How to 
get the user login name</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-Client-sidesupport">Client-side support</a></li><li><a 
shape="rect" href="#JAX-RSOAuth2-OAuth2withouttheExplicitAuthorization">OAuth2 
without the Explicit Authorization</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-OAuthWithoutaBrowser">OAuth Without a 
Browser</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-Reportingerrordetails">Reporting error 
details</a></li><li><a shape="rect" href="#JAX-RSOAuth2-OAuth2andJOSE">OAuth2 
and JOSE</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-Designconsiderations">Design considerations</a>
+</li><li><a shape="rect" href="#JAX-RSOAuth2-Howtogettheuserloginname">How to 
get the user login name</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-Client-sidesupport">Client-side support</a></li><li><a 
shape="rect" href="#JAX-RSOAuth2-OAuth2withouttheExplicitAuthorization">OAuth2 
without the Explicit Authorization</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-OAuthWithoutaBrowser">OAuth Without a 
Browser</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-Reportingerrordetails">Reporting error 
details</a></li><li><a shape="rect" href="#JAX-RSOAuth2-OAuth2andJOSE">OAuth2 
and JOSE</a></li><li><a shape="rect" href="#JAX-RSOAuth2-OAuth2andOIDC">OAuth2 
and OIDC</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-Designconsiderations">Design considerations</a>
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSOAuth2-ControllingtheAccesstoResourceServer">Controlling the 
Access to Resource Server</a>
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSOAuth2-Sharingthesameaccesspathbetweenendusersandclients">Sharing 
the same access path between end users and clients</a></li><li><a shape="rect" 
href="#JAX-RSOAuth2-Providingdifferentaccesspointstoendusersandclients">Providing
 different access points to end users and clients</a></li></ul>
 </li><li><a shape="rect" href="#JAX-RSOAuth2-SingleSignOn">Single Sign 
On</a></li></ul>
@@ -360,7 +360,7 @@ return token;
 // decrypt a token given a token key
 
 ModelEncryptionSupport.decryptAccessToken(this, encryptedToken, 
key);]]></script>
-</div></div><pre>&#160;</pre><h5 id="JAX-RSOAuth2-UsingCertificates">Using 
Certificates</h5><p>Working with the certificates to encrypt the state is 
similar to working with the symmetric keys. Please check the code examples in 
<a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/test/java/org/apache/cxf/rs/security/oauth2/utils/EncryptionUtilsTest.java";>EncryptionsUtilsTest</a>.</p><p>One
 needs to load a Certificate, use its public key to encrypt and the private key 
to decrypt. using the certificate to encrypt the whole serialized token 
representation might be marginally slower compared to using the symmetric keys, 
however given that the sequence is about 300+ characters maximum the 
performance can be reasonable.</p><h5 
id="JAX-RSOAuth2-UsingCertificatesandSecretKeys">Using Certificates and Secret 
Keys</h5><p>The other approach is to generate a secret key, use this key to 
encrypt the token and then use the certi
 ficate to encrypt the key. The encrypted token and the actual encrypted secret 
key can be returned to the client as a token parameter, for example, as a 'key' 
parameter. This 'key' parameter will need to be returned to the OAuth2 server, 
via the HTTP header or the custom authorization scheme. The data providers 
using this mechanism will need to implement AccessTokenValidator and decrypt 
the encrypted key with the private certificate key, and decrypt the token with 
the decrypted secret key. Please check the code example in <a shape="rect" 
class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/test/java/org/apache/cxf/rs/security/oauth2/utils/EncryptionUtilsTest.java";>EncryptionsUtilsTest</a>.</p><h5
 id="JAX-RSOAuth2-EncryptedJWTTokens">Encrypted JWT Tokens</h5><p>JWT Token can 
be JWE-encrypted and the encrypted string passed to ServerAccessToken as access 
token id parameter.</p><p>See <a shape="rect" href="json-web-tokens.html">JS
 ON Web Tokens</a> wiki page for more information on how to sign and encrypt 
JSON Web Tokens.</p><h4 id="JAX-RSOAuth2-Customtokens">Custom tokens</h4><p>If 
needed, users can use their own custom token types, with the only restriction 
that the custom token type implementations have to extend 
org.apache.cxf.rs.security.oauth2.common.ServerAccessToken.</p><h4 
id="JAX-RSOAuth2-SimpleTokensandAudience">Simple Tokens and 
Audience</h4><p>Starting from CXF 2.7.7 an <a shape="rect" 
class="external-link" 
href="http://tools.ietf.org/html/draft-tschofenig-oauth-audience-00"; 
rel="nofollow">audience</a> parameter is supported during the client token 
requests.</p><h3 
id="JAX-RSOAuth2-AccessTokenValidationService">AccessTokenValidationService</h3><p>The
 <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenValidationService.java";>AccessTokenValidationService</a>
 is a
  CXF specific OAuth2 service for accepting the remote access token validation 
requests. Typically, OAuthRequestFilter (see on it below) may choose to 
impersonate itself as a third-party client and will ask 
AccessTokenValidationService to return the information relevant to the current 
access token, before setting up a security context. More on it below.</p><h2 
id="JAX-RSOAuth2-TokenRevocationService">TokenRevocationService</h2><p><a 
shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/TokenRevocationService.java";>TokenRevocationService</a>
 is a simple OAuth2 service supporting the clients wishing to revoke the access 
or refresh tokens they own themselves, please see <a shape="rect" 
class="external-link" 
href="http://tools.ietf.org/html/draft-ietf-oauth-revocation-09"; 
rel="nofollow">OAuth2 Token Revocation Draft</a> for more 
information.</p><p>TokenRevocationServic
 e and AccessTokenService share the same code which enforces that the clients 
have been correctly authenticated.</p><p>Note, OAuthDataProvider 
implementations processing a revocation request should simply ignore the 
invalid tokens as recommended by the specification which will let 
TokenRevocationService return HTTP 200 which is done to minimize a possible 
attack surface (specifically for bad clients not to see if their requests 
failed or succeeded) and throw the exceptions only if the token revocation 
feature is not currently supported.</p><h2 
id="JAX-RSOAuth2-SupportedGrants">Supported Grants</h2><p>The following 
subsections briefly describe how the well-known grant types can be supported on 
the server side. Please also check the "Client Side Support" section on how to 
use the related <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/AccessTokenGrant.java";>Ac
 cessTokenGrant</a> implementations to request the access tokens.</p><h3 
id="JAX-RSOAuth2-AuthorizationCode">Authorization Code</h3><p>As described 
above, <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AuthorizationCodeGrantService.java";>AuthorizationCodeGrantService</a>
 service and <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/code/AuthorizationCodeDataProvider.java";>AuthorizationCodeDataProvider</a>
 data provider can support a redirection-based Authorization Code 
flow.</p><p>The code that the client receives in the end of the redirection 
process will need to be exchanged for a new access token with 
AccessTokenService. CXF-based clients can use a helper <a shape="rect" 
class="external-link" href="http://svn.apache.org/repos/as
 
f/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/code/AuthorizationCodeGrant.java">AuthorizationCodeGrant</a>
 bean to request a new access token with OAuthClientUtils.</p><h3 
id="JAX-RSOAuth2-Implicit">Implicit</h3><p>Implicit grant is supported the same 
way Authorization Code grant is except that the response to the client running 
within a web browser is formatted differently, using URI fragments.</p><p><a 
shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/ImplicitGrantService.java";>ImplicitGrantService</a>
 service and <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/code/AuthorizationCodeDataProvider.java";>AuthorizationCodeDataProvider</a>
 data provider can support a redirection-bas
 ed Implicit flow.</p><p>Note the only difference is the use of 
ImplicitGrantService instead of AuthorizationCodeGrantService.</p><p>Also note 
that when an Implicit grant client (running within a browser) replaces the code 
grant for a new access token and tries to access the end user's resource, Cross 
Origin Resource Sharing (CORS) support will most likely need to be enabled on 
the end user's resource server.<br clear="none"> The simplest approach is to 
register a CXF <a shape="rect" 
href="http://cxf.apache.org/docs/jax-rs-cors.html";>CORS filter</a>, right 
before OAuth2 filter (see on it below).</p><p>Starting from CXF 2.7.5 it is 
possible to request ImplicitGrantService to return a registered Client id to 
the browser-hosted client. This is recommended so that the client can verify 
that the token is meant to be delivered to this client.</p><h3 
id="JAX-RSOAuth2-ClientCredentials">Client Credentials</h3><p>Register <a 
shape="rect" class="external-link" href="http://svn.apache.org/repos
 
/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/clientcred/ClientCredentialsGrantHandler.java">ClientCredentialsGrantHandler</a>
 handler with AccessTokenService for this grant be supported.</p><p>CXF-based 
clients can use a helper <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/clientcred/ClientCredentialsGrant.java";>ClientCredentialsGrant</a>
 bean to request a new access token with OAuthClientUtils.</p><h3 
id="JAX-RSOAuth2-ResourceOwnerPasswordCredentials">Resource Owner Password 
Credentials</h3><p>Register <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/owner/ResourceOwnerGrantHandler.java";>ResourceOwnerGrantHandler</a>
 handler with AccessTokenService for this grant be supp
 orted.</p><p>CXF-based clients can use a helper <a shape="rect" 
class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/owner/ResourceOwnerGrant.java";>ResourceOwnerGrant</a>
 bean to request a new access token with OAuthClientUtils.</p><h3 
id="JAX-RSOAuth2-RefreshToken">Refresh Token</h3><p>The client can issue a 
refresh token grant if the current access token it owns has expired or been 
revoked and the refresh token was issued alongside with the access token which 
is now invalid and get the new, 'refreshed' access token. This can allow the 
client to avoid seeking a new authorization approval from the end 
user.</p><p>Register <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/refresh/RefreshTokenGrantHandler.java";>RefreshTokenGrantHandler</a>
 handler with Acc
 essTokenService for this grant be supported. Note this grant handler is only 
useful for refreshing the existing access token, so one or more of the other 
grant handlers (Authorization Code, Implicit, etc) will also have to be 
registered with AccessTokenService.</p><p>CXF-based clients can use a helper <a 
shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/refresh/RefreshTokenGrant.java";>RefreshTokenGrant</a>
 bean to request a new access token with OAuthClientUtils.</p><h3 
id="JAX-RSOAuth2-Assertions">Assertions</h3><p>SAML2 Bearer and JWT assertions 
can be used as token grants.</p><p>Please see <a shape="rect" 
href="jaxrs-oauth2-assertions.html">JAXRS OAuth2 Assertions</a> section for 
more information.</p><h3 id="JAX-RSOAuth2-CustomGrants">Custom Grants</h3><p>If 
you need to customize the way the well-known grant requests are handled then 
consider extending one of
  the grant handlers listed in the previous sub-sections.</p><p>Alternatively 
create a custom <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AccessTokenGrantHandler.java";>AccessTokenGrantHandler</a>
 and register it with AccessTokenService. Additionally, consider providing a 
related <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/AccessTokenGrant.java";>AccessTokenGrant</a>
 implementation for making it easy for the client code to request a new access 
token with this custom grant.</p><h2 
id="JAX-RSOAuth2-RedirectionFlowFilters">Redirection Flow Filters</h2><p><a 
shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/securi
 
ty/oauth2/provider/AuthorizationCodeRequestFilter.java;h=646861c1ea3f9effad74bd234c0576f638009932;hb=HEAD">AuthorizationCodeRequestFilter</a>
 implementations can be registered with AuthorizationCodeService in order to 
pre-process code requests. For example, <a shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/code/JwtRequestCodeFilter.java;h=a318c2c405c813e9c07f1b22c4b2afbfccd6101e;hb=HEAD";>JwtRequestCodeFilter</a>
 can be used to process JWS-signed or JWE-encrypted code requests.</p><p><a 
shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AuthorizationCodeResponseFilter.java;h=f363a461ed21be5a2b87584271bcce2933402ab6;hb=HEAD";>AuthorizationCodeResponseFilter</a>
 implementations can be registered with Authori
 zationCodeService in order to post-process code responses.</p><h2 
id="JAX-RSOAuth2-AccessTokenResponseFilters">AccessTokenResponse 
Filters</h2><p><a shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AccessTokenResponseFilter.java;h=f6058e6d2d2aa54543514cbfe2d0d9951a30db68;hb=HEAD";>AccessTokenResponseFilter</a>
 implementations can be registered with AccessTokenService in order to 
post-process access token responses. For example,&#160; OIDC id_token can be 
added to a response with a <a shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/idp/UserInfoCodeResponseFilter.java;h=42bf9ff41004a32903e6839495d9edde5963c2e3;hb=HEAD";>filter</a>.
 Filters can also calculate an access token response signature, etc.</p><h2 
id="JAX-RSOAuth2-PreA
 uthorizedaccesstokens">PreAuthorized access tokens</h2><p>When working with 
the flows which require the end users/resource owners explicitly authorizing 
clients (for example, as in the case of redirection-based flows), using 
pre-authorized access tokens is one option to minimize the need for the 
end-user intervention. <br clear="none"> OAuthDataProvider is always checked 
first if the pre-authorized access token for a given Client exists and if yes 
then it will be returned immediately, without starting the authorization 
process involving the end user (as required by some flows).</p><p>Consider 
providing a user interface which will let the end users/resource owners to 
pre-authorize specific clients early. Note, a CXF service for supporting the 
users pre-authorizing the clients or revoking the tokens for some of the 
clients may be introduced in the future.</p><p>Also note that using a refresh 
token grant may further help with minimizing the end user involvement, in cases 
when the curre
 nt access token has expired.</p><h2 
id="JAX-RSOAuth2-Pre-registeredscopes">Pre-registered scopes</h2><p>Clients can 
register custom scopes they will be expected to use and then avoid specifying 
the scopes when requesting the code grants or access tokens.<br clear="none"> 
Alternatively it makes it easier to support so called wild-card scopes. For 
example, a client pre-registers a scope "update" and actually uses an 
"update-7" scope: Redirection-based services and access token grants can be 
configured to do a partial scope match, in this case, validate that "update-7" 
starts from "update"</p><h2 id="JAX-RSOAuth2-WritingOAuthDataProvider">Writing 
OAuthDataProvider</h2><p>Using CXF OAuth service implementations will help a 
lot with setting up an OAuth server. As you can see from the above sections, 
these services rely on a custom <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/securi
 ty/oauth2/provider/OAuthDataProvider.java">OAuthDataProvider</a> 
implementation.</p><p>The main task of OAuthDataProvider is to persist and 
generate access tokens. Additionally, as noted above, 
AuthorizationCodeDataProvider needs to persist and remove the code grant 
registrations. The way it's done is really application-specific. Consider 
starting with a basic memory based implementation and then move on to keeping 
the data in some DB.</p><p>Note that OAuthDataProvider supports retrieving <a 
shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/Client.java";>Client</a>
 instances but it has no methods for creating or removing Clients. The reason 
for it is that the process of registering third-party clients is very specific 
to a particular OAuth2 application, so CXF does not offer a registration 
support service and hence OAuthDataProvider has no Client create/update me
 thods. You will likely need to do something like this:</p><div class="code 
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><pre>&#160;</pre><h5 id="JAX-RSOAuth2-UsingCertificates">Using 
Certificates</h5><p>Working with the certificates to encrypt the state is 
similar to working with the symmetric keys. Please check the code examples in 
<a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/test/java/org/apache/cxf/rs/security/oauth2/utils/EncryptionUtilsTest.java";>EncryptionsUtilsTest</a>.</p><p>One
 needs to load a Certificate, use its public key to encrypt and the private key 
to decrypt. using the certificate to encrypt the whole serialized token 
representation might be marginally slower compared to using the symmetric keys, 
however given that the sequence is about 300+ characters maximum the 
performance can be reasonable.</p><h5 
id="JAX-RSOAuth2-UsingCertificatesandSecretKeys">Using Certificates and Secret 
Keys</h5><p>The other approach is to generate a secret key, use this key to 
encrypt the token and then use the certi
 ficate to encrypt the key. The encrypted token and the actual encrypted secret 
key can be returned to the client as a token parameter, for example, as a 'key' 
parameter. This 'key' parameter will need to be returned to the OAuth2 server, 
via the HTTP header or the custom authorization scheme. The data providers 
using this mechanism will need to implement AccessTokenValidator and decrypt 
the encrypted key with the private certificate key, and decrypt the token with 
the decrypted secret key. Please check the code example in <a shape="rect" 
class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/test/java/org/apache/cxf/rs/security/oauth2/utils/EncryptionUtilsTest.java";>EncryptionsUtilsTest</a>.</p><h5
 id="JAX-RSOAuth2-EncryptedJWTTokens">Encrypted JWT Tokens</h5><p>JWT Token can 
be JWE-encrypted and the encrypted string passed to ServerAccessToken as access 
token id parameter.</p><p>See <a shape="rect" href="jax-rs-jose.html">JAX-RS
  Jose</a> wiki page for more information on how to sign and encrypt JSON Web 
Tokens.</p><h4 id="JAX-RSOAuth2-Customtokens">Custom tokens</h4><p>If needed, 
users can use their own custom token types, with the only restriction that the 
custom token type implementations have to extend 
org.apache.cxf.rs.security.oauth2.common.ServerAccessToken.</p><h4 
id="JAX-RSOAuth2-SimpleTokensandAudience">Simple Tokens and 
Audience</h4><p>Starting from CXF 2.7.7 an <a shape="rect" 
class="external-link" 
href="http://tools.ietf.org/html/draft-tschofenig-oauth-audience-00"; 
rel="nofollow">audience</a> parameter is supported during the client token 
requests.</p><h3 
id="JAX-RSOAuth2-AccessTokenValidationService">AccessTokenValidationService</h3><p>The
 <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AccessTokenValidationService.java";>AccessTokenValidationService</a>
 is a CXF spe
 cific OAuth2 service for accepting the remote access token validation 
requests. Typically, OAuthRequestFilter (see on it below) may choose to 
impersonate itself as a third-party client and will ask 
AccessTokenValidationService to return the information relevant to the current 
access token, before setting up a security context. More on it below.</p><h2 
id="JAX-RSOAuth2-TokenRevocationService">TokenRevocationService</h2><p><a 
shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/TokenRevocationService.java";>TokenRevocationService</a>
 is a simple OAuth2 service supporting the clients wishing to revoke the access 
or refresh tokens they own themselves, please see <a shape="rect" 
class="external-link" 
href="http://tools.ietf.org/html/draft-ietf-oauth-revocation-09"; 
rel="nofollow">OAuth2 Token Revocation Draft</a> for more 
information.</p><p>TokenRevocationService and Ac
 cessTokenService share the same code which enforces that the clients have been 
correctly authenticated.</p><p>Note, OAuthDataProvider implementations 
processing a revocation request should simply ignore the invalid tokens as 
recommended by the specification which will let TokenRevocationService return 
HTTP 200 which is done to minimize a possible attack surface (specifically for 
bad clients not to see if their requests failed or succeeded) and throw the 
exceptions only if the token revocation feature is not currently 
supported.</p><h2 id="JAX-RSOAuth2-SupportedGrants">Supported Grants</h2><p>The 
following subsections briefly describe how the well-known grant types can be 
supported on the server side. Please also check the "Client Side Support" 
section on how to use the related <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/AccessTokenGrant.java";>AccessToke
 nGrant</a> implementations to request the access tokens.</p><h3 
id="JAX-RSOAuth2-AuthorizationCode">Authorization Code</h3><p>As described 
above, <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/AuthorizationCodeGrantService.java";>AuthorizationCodeGrantService</a>
 service and <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/code/AuthorizationCodeDataProvider.java";>AuthorizationCodeDataProvider</a>
 data provider can support a redirection-based Authorization Code 
flow.</p><p>The code that the client receives in the end of the redirection 
process will need to be exchanged for a new access token with 
AccessTokenService. CXF-based clients can use a helper <a shape="rect" 
class="external-link" href="http://svn.apache.org/repos/asf/cxf/tr
 
unk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/code/AuthorizationCodeGrant.java">AuthorizationCodeGrant</a>
 bean to request a new access token with OAuthClientUtils.</p><h3 
id="JAX-RSOAuth2-Implicit">Implicit</h3><p>Implicit grant is supported the same 
way Authorization Code grant is except that the response to the client running 
within a web browser is formatted differently, using URI fragments.</p><p><a 
shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/services/ImplicitGrantService.java";>ImplicitGrantService</a>
 service and <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/code/AuthorizationCodeDataProvider.java";>AuthorizationCodeDataProvider</a>
 data provider can support a redirection-based Impli
 cit flow.</p><p>Note the only difference is the use of ImplicitGrantService 
instead of AuthorizationCodeGrantService.</p><p>Also note that when an Implicit 
grant client (running within a browser) replaces the code grant for a new 
access token and tries to access the end user's resource, Cross Origin Resource 
Sharing (CORS) support will most likely need to be enabled on the end user's 
resource server.<br clear="none"> The simplest approach is to register a CXF <a 
shape="rect" href="http://cxf.apache.org/docs/jax-rs-cors.html";>CORS 
filter</a>, right before OAuth2 filter (see on it below).</p><p>Starting from 
CXF 2.7.5 it is possible to request ImplicitGrantService to return a registered 
Client id to the browser-hosted client. This is recommended so that the client 
can verify that the token is meant to be delivered to this client.</p><h3 
id="JAX-RSOAuth2-ClientCredentials">Client Credentials</h3><p>Register <a 
shape="rect" class="external-link" href="http://svn.apache.org/repos/asf/cxf
 
/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/clientcred/ClientCredentialsGrantHandler.java">ClientCredentialsGrantHandler</a>
 handler with AccessTokenService for this grant be supported.</p><p>CXF-based 
clients can use a helper <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/clientcred/ClientCredentialsGrant.java";>ClientCredentialsGrant</a>
 bean to request a new access token with OAuthClientUtils.</p><h3 
id="JAX-RSOAuth2-ResourceOwnerPasswordCredentials">Resource Owner Password 
Credentials</h3><p>Register <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/owner/ResourceOwnerGrantHandler.java";>ResourceOwnerGrantHandler</a>
 handler with AccessTokenService for this grant be supported.</
 p><p>CXF-based clients can use a helper <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/owner/ResourceOwnerGrant.java";>ResourceOwnerGrant</a>
 bean to request a new access token with OAuthClientUtils.</p><h3 
id="JAX-RSOAuth2-RefreshToken">Refresh Token</h3><p>The client can issue a 
refresh token grant if the current access token it owns has expired or been 
revoked and the refresh token was issued alongside with the access token which 
is now invalid and get the new, 'refreshed' access token. This can allow the 
client to avoid seeking a new authorization approval from the end 
user.</p><p>Register <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/refresh/RefreshTokenGrantHandler.java";>RefreshTokenGrantHandler</a>
 handler with AccessToken
 Service for this grant be supported. Note this grant handler is only useful 
for refreshing the existing access token, so one or more of the other grant 
handlers (Authorization Code, Implicit, etc) will also have to be registered 
with AccessTokenService.</p><p>CXF-based clients can use a helper <a 
shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/refresh/RefreshTokenGrant.java";>RefreshTokenGrant</a>
 bean to request a new access token with OAuthClientUtils.</p><h3 
id="JAX-RSOAuth2-Assertions">Assertions</h3><p>SAML2 Bearer and JWT assertions 
can be used as token grants.</p><p>Please see <a shape="rect" 
href="jaxrs-oauth2-assertions.html">JAXRS OAuth2 Assertions</a> section for 
more information.</p><h3 id="JAX-RSOAuth2-CustomGrants">Custom Grants</h3><p>If 
you need to customize the way the well-known grant requests are handled then 
consider extending one of the gra
 nt handlers listed in the previous sub-sections.</p><p>Alternatively create a 
custom <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AccessTokenGrantHandler.java";>AccessTokenGrantHandler</a>
 and register it with AccessTokenService. Additionally, consider providing a 
related <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/AccessTokenGrant.java";>AccessTokenGrant</a>
 implementation for making it easy for the client code to request a new access 
token with this custom grant.</p><h2 
id="JAX-RSOAuth2-RedirectionFlowFilters">Redirection Flow Filters</h2><p><a 
shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth
 
2/provider/AuthorizationCodeRequestFilter.java;h=646861c1ea3f9effad74bd234c0576f638009932;hb=HEAD">AuthorizationCodeRequestFilter</a>
 implementations can be registered with AuthorizationCodeService in order to 
pre-process code requests. For example, <a shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/grants/code/JwtRequestCodeFilter.java;h=a318c2c405c813e9c07f1b22c4b2afbfccd6101e;hb=HEAD";>JwtRequestCodeFilter</a>
 can be used to process JWS-signed or JWE-encrypted code requests.</p><p><a 
shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AuthorizationCodeResponseFilter.java;h=f363a461ed21be5a2b87584271bcce2933402ab6;hb=HEAD";>AuthorizationCodeResponseFilter</a>
 implementations can be registered with AuthorizationCo
 deService in order to post-process code responses.</p><h2 
id="JAX-RSOAuth2-AccessTokenResponseFilters">AccessTokenResponse 
Filters</h2><p><a shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/AccessTokenResponseFilter.java;h=f6058e6d2d2aa54543514cbfe2d0d9951a30db68;hb=HEAD";>AccessTokenResponseFilter</a>
 implementations can be registered with AccessTokenService in order to 
post-process access token responses. For example,&#160; OIDC id_token can be 
added to a response with a <a shape="rect" class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=rt/rs/security/sso/oidc/src/main/java/org/apache/cxf/rs/security/oidc/idp/UserInfoCodeResponseFilter.java;h=42bf9ff41004a32903e6839495d9edde5963c2e3;hb=HEAD";>filter</a>.
 Filters can also calculate an access token response signature, etc.</p><h2 
id="JAX-RSOAuth2-PreAuthorize
 daccesstokens">PreAuthorized access tokens</h2><p>When working with the flows 
which require the end users/resource owners explicitly authorizing clients (for 
example, as in the case of redirection-based flows), using pre-authorized 
access tokens is one option to minimize the need for the end-user intervention. 
<br clear="none"> OAuthDataProvider is always checked first if the 
pre-authorized access token for a given Client exists and if yes then it will 
be returned immediately, without starting the authorization process involving 
the end user (as required by some flows).</p><p>Consider providing a user 
interface which will let the end users/resource owners to pre-authorize 
specific clients early. Note, a CXF service for supporting the users 
pre-authorizing the clients or revoking the tokens for some of the clients may 
be introduced in the future.</p><p>Also note that using a refresh token grant 
may further help with minimizing the end user involvement, in cases when the 
current acces
 s token has expired.</p><h2 
id="JAX-RSOAuth2-Pre-registeredscopes">Pre-registered scopes</h2><p>Clients can 
register custom scopes they will be expected to use and then avoid specifying 
the scopes when requesting the code grants or access tokens.<br clear="none"> 
Alternatively it makes it easier to support so called wild-card scopes. For 
example, a client pre-registers a scope "update" and actually uses an 
"update-7" scope: Redirection-based services and access token grants can be 
configured to do a partial scope match, in this case, validate that "update-7" 
starts from "update"</p><h2 id="JAX-RSOAuth2-WritingOAuthDataProvider">Writing 
OAuthDataProvider</h2><p>Using CXF OAuth service implementations will help a 
lot with setting up an OAuth server. As you can see from the above sections, 
these services rely on a custom <a shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth
 2/provider/OAuthDataProvider.java">OAuthDataProvider</a> 
implementation.</p><p>The main task of OAuthDataProvider is to persist and 
generate access tokens. Additionally, as noted above, 
AuthorizationCodeDataProvider needs to persist and remove the code grant 
registrations. The way it's done is really application-specific. Consider 
starting with a basic memory based implementation and then move on to keeping 
the data in some DB.</p><p>Note that OAuthDataProvider supports retrieving <a 
shape="rect" class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/Client.java";>Client</a>
 instances but it has no methods for creating or removing Clients. The reason 
for it is that the process of registering third-party clients is very specific 
to a particular OAuth2 application, so CXF does not offer a registration 
support service and hence OAuthDataProvider has no Client create/update 
methods. Y
 ou will likely need to do something like this:</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <script class="theme: Default; brush: java; gutter: false" 
type="syntaxhighlighter"><![CDATA[public class CustomOAuthProvider implements 
OAuthDataProvider {
    public Client registerClient(String applicationName, String applicationURI, 
...) {}
    public void removeClient(String cliendId) {}
@@ -601,7 +601,7 @@ try {
     &lt;property name=&quot;writeCustomErrors&quot; value=&quot;true&quot;/&gt;
 &lt;/bean&gt;
 ]]></script>
-</div></div><h1 id="JAX-RSOAuth2-OAuth2andJOSE">OAuth2 and 
JOSE</h1><p>TODO</p><h1 id="JAX-RSOAuth2-Designconsiderations">Design 
considerations</h1><p>This section will talk about various design 
considerations one need to take into account when deploying OAuth-based 
solutions.</p><h2 
id="JAX-RSOAuth2-ControllingtheAccesstoResourceServer">Controlling the Access 
to Resource Server</h2><p>One of the most important issues one need to resolve 
is how to partition a URI space of the resource server application.</p><p>We 
have two different parties trying to access it, the end users which access the 
resource server to get to the resources which they own and 3rd party clients 
which have been authorized by the end users to access some of their 
resources.</p><p>In the former case the way the authentication is managed is 
completely up to the resource server application: basic authentication, two-way 
TLS, OpenId (more on it below), you name it.</p><p>In the latter case an OAuth 
filter must enforc
 e that the 3rd party client has been registered using the provided client key 
and that it has a valid access token which represents the end user's 
approval.</p><p>Letting both parties access the resource server via the same 
URI(s) complicates the life for the security filters but all the parties are 
only aware of the single resource server URI which all of them will 
use.</p><p>Providing different access points to end users and clients may 
significantly simplify the authentication process - the possible downside is 
that multiple access points need to be maintained by the resource 
server.</p><p>Both options are discussed next.</p><h3 
id="JAX-RSOAuth2-Sharingthesameaccesspathbetweenendusersandclients">Sharing the 
same access path between end users and clients</h3><p>The first problem which 
needs to be addressed is how to distinguish end users from third-party clients 
and get both parties authenticated as required.<br clear="none"> Perhaps the 
simplest option is to extend a CXF OAuth2 f
 ilter (JAX-RS or servlet one), check Authorization header, if it is OAuth2 
then delegate to the superclass, alternatively - proceed with authenticating 
the end users:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
+</div></div><h1 id="JAX-RSOAuth2-OAuth2andJOSE">OAuth2 and JOSE</h1><p>See <a 
shape="rect" href="jax-rs-jose.html">JAX-RS Jose</a> wiki page for the 
information about JOSE and how it is supported in CXF,</p><p>//TODO: describe 
how Jose is used in CXF OAuth2</p><p>&#160;</p><h1 
id="JAX-RSOAuth2-OAuth2andOIDC">OAuth2 and 
OIDC</h1><p>&#160;</p><p>//TODO</p><h1 
id="JAX-RSOAuth2-Designconsiderations">Design considerations</h1><p>This 
section will talk about various design considerations one need to take into 
account when deploying OAuth-based solutions.</p><h2 
id="JAX-RSOAuth2-ControllingtheAccesstoResourceServer">Controlling the Access 
to Resource Server</h2><p>One of the most important issues one need to resolve 
is how to partition a URI space of the resource server application.</p><p>We 
have two different parties trying to access it, the end users which access the 
resource server to get to the resources which they own and 3rd party clients 
which have been authorized by the end users t
 o access some of their resources.</p><p>In the former case the way the 
authentication is managed is completely up to the resource server application: 
basic authentication, two-way TLS, OpenId (more on it below), you name 
it.</p><p>In the latter case an OAuth filter must enforce that the 3rd party 
client has been registered using the provided client key and that it has a 
valid access token which represents the end user's approval.</p><p>Letting both 
parties access the resource server via the same URI(s) complicates the life for 
the security filters but all the parties are only aware of the single resource 
server URI which all of them will use.</p><p>Providing different access points 
to end users and clients may significantly simplify the authentication process 
- the possible downside is that multiple access points need to be maintained by 
the resource server.</p><p>Both options are discussed next.</p><h3 
id="JAX-RSOAuth2-Sharingthesameaccesspathbetweenendusersandclients">Sharing the 
 same access path between end users and clients</h3><p>The first problem which 
needs to be addressed is how to distinguish end users from third-party clients 
and get both parties authenticated as required.<br clear="none"> Perhaps the 
simplest option is to extend a CXF OAuth2 filter (JAX-RS or servlet one), check 
Authorization header, if it is OAuth2 then delegate to the superclass, 
alternatively - proceed with authenticating the end users:</p><div class="code 
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <script class="theme: Default; brush: java; gutter: false" 
type="syntaxhighlighter"><![CDATA[public class SecurityFilter extends 
org.apache.cxf.rs.security.oauth2.filters.OAuthRequestFilter {
    @Context
    private HttpHeaders headers;
@@ -640,7 +640,7 @@ public class CalendarResource {
    }
 }
 ]]></script>
-</div></div><p>Let's assume that the 3rd party client has been allowed to read 
the public user Calendars at "/calendar/{id}" only, how to make sure that the 
client won't try to:<br clear="none"> 1. update the calendar available at the 
same path <br clear="none"> 2. read the private Calendars available at 
"/calendar/{id}/private"</p><p>As noted above, <a shape="rect" 
class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/OAuthPermission.java";>OAuthPermission</a>
 has an optional URIs property. Thus one way to solve the problem with the 
private calendar is to add, say, a uri "/calendar/{id}" or "/calendar/1" (etc) 
property to OAuthPermission (representing a scope like "readCalendar") and the 
OAuth filter will make sure no subresources beyond "/calendar/{id}" can be 
accessed. Note, adding a "*" at the end of a given URI property, for example, 
"/a*" will let the client access "/a", "/
 a/b", etc.</p><p>Solving the problem with preventing the update can be easily 
solved by adding an httpVerb property to a given OAuthPermission.</p><p>One 
more option is to rely on the role-based access control and have @RolesAllowed 
allocated such that only users in roles like "client" or "enduser" can invoke 
the getCalendar() method and let only those in the "enduser" role access 
getPrivateCalendar() and updateCalendar(). OAuthPermission can help here too as 
described in the section on using OAuth fiters.</p><h3 
id="JAX-RSOAuth2-Providingdifferentaccesspointstoendusersandclients">Providing 
different access points to end users and clients</h3><p>Rather than letting 
both the end users and 3rd party clients use the same URI such as 
"http://myapp.com/service/calendars/{id}";, one may want to introduce two URIs, 
one for end users and one for third-party clients, for example, 
"http://myapp.com/service/calendars/{id}"; - for endusers, 
"http://myapp.com/partners/calendars/{id}"; - for the 3rd
  party clients and deploy 2 jaxrs endpoints, where one is protected by the 
security filter checking the end users, and the one - by OAuth 
filters.</p><p>Additionally the endpoint managing the 3rd party clients will 
deploy a resource which will offer a resticted URI space support. For example, 
if the application will only allow 3rd party clients to read calendars then 
this resource will only have a method supporting @GET and 
"/calendar/{id}".</p><h2 id="JAX-RSOAuth2-SingleSignOn">Single Sign 
On</h2><p>When dealing with authenticating the end users, having an SSO 
solution in place is very handy. This is because the end user interacts with 
both the third-party and its resource server web applications and is also 
redirected from the client application to the resource server and back again. 
Additionally, the end user may need to authenticate with Authorization service 
if it is not collocated with the application endpoints. OpenID or say a 
WebBrowser SSO profile can help.</p><p>CXF 2.6.1 
 provides an initial support for a <a shape="rect" 
href="http://cxf.apache.org/docs/saml-web-sso.html";>SAML2 SSO profile</a>. This 
will make it easier to minimize a number of sign ins to a single attempt and 
run OAuth2 Authorization servers separately from the application 
endpoints.</p></div>
+</div></div><p>Let's assume that the 3rd party client has been allowed to read 
the public user Calendars at "/calendar/{id}" only, how to make sure that the 
client won't try to:<br clear="none"> 1. update the calendar available at the 
same path <br clear="none"> 2. read the private Calendars available at 
"/calendar/{id}/private"</p><p>As noted above, <a shape="rect" 
class="external-link" 
href="http://svn.apache.org/repos/asf/cxf/trunk/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/common/OAuthPermission.java";>OAuthPermission</a>
 has an optional URIs property. Thus one way to solve the problem with the 
private calendar is to add, say, a uri "/calendar/{id}" or "/calendar/1" (etc) 
property to OAuthPermission (representing a scope like "readCalendar") and the 
OAuth filter will make sure no subresources beyond "/calendar/{id}" can be 
accessed. Note, adding a "*" at the end of a given URI property, for example, 
"/a*" will let the client access "/a", "/
 a/b", etc.</p><p>Solving the problem with preventing the update can be easily 
solved by adding an httpVerb property to a given OAuthPermission.</p><p>One 
more option is to rely on the role-based access control and have @RolesAllowed 
allocated such that only users in roles like "client" or "enduser" can invoke 
the getCalendar() method and let only those in the "enduser" role access 
getPrivateCalendar() and updateCalendar(). OAuthPermission can help here too as 
described in the section on using OAuth fiters.</p><h3 
id="JAX-RSOAuth2-Providingdifferentaccesspointstoendusersandclients">Providing 
different access points to end users and clients</h3><p>Rather than letting 
both the end users and 3rd party clients use the same URI such as 
"http://myapp.com/service/calendars/{id}";, one may want to introduce two URIs, 
one for end users and one for third-party clients, for example, 
"http://myapp.com/service/calendars/{id}"; - for endusers, 
"http://myapp.com/partners/calendars/{id}"; - for the 3rd
  party clients and deploy 2 jaxrs endpoints, where one is protected by the 
security filter checking the end users, and the one - by OAuth 
filters.</p><p>Additionally the endpoint managing the 3rd party clients will 
deploy a resource which will offer a resticted URI space support. For example, 
if the application will only allow 3rd party clients to read calendars then 
this resource will only have a method supporting @GET and 
"/calendar/{id}".</p><h2 id="JAX-RSOAuth2-SingleSignOn">Single Sign 
On</h2><p>When dealing with authenticating the end users, having an SSO 
solution in place is very handy. This is because the end user interacts with 
both the third-party and its resource server web applications and is also 
redirected from the client application to the resource server and back again. 
Additionally, the end user may need to authenticate with Authorization service 
if it is not collocated with the application endpoints. OpenID or say a 
WebBrowser SSO profile can help.</p><p>CXF 2.6.1 
 provides an initial support for a <a shape="rect" 
href="http://cxf.apache.org/docs/saml-web-sso.html";>SAML2 SSO profile</a>. This 
will make it easier to minimize a number of sign ins to a single attempt and 
run OAuth2 Authorization servers separately from the application 
endpoints.</p><p>The work started in CXF 3.1.0 for integrating with OpenId 
Connect.</p></div>
            </div>
            <!-- Content -->
          </td>


Reply via email to