Hi, Rajesh and David:

While it is possible to modify the rewriter declarations distributed with the 
REST API, that would be modifying the implementation of the REST API.  The 
rewriter declarations are internal to the REST API, not part of the documented 
interface.

Such changes would fall in the same category as modifying the XQuery and 
JavaScript modules that implement the REST API.  The distributed implementation 
can change in any release, even a point release.  Also, MarkLogic cannot 
support the REST API if the implementation has been changed.

In other words, you should be aware that you are taking a risk.


Erik Hennum


________________________________
From: general-boun...@developer.marklogic.com 
[general-boun...@developer.marklogic.com] on behalf of David Lee 
[david....@marklogic.com]
Sent: Wednesday, April 19, 2017 7:16 AM
To: MarkLogic Developer Discussion
Subject: Re: [MarkLogic Dev General] custom Rest rewriter

If I understand your architecture correctly,   you have 2 'parts' of an app in 
one context.   Is this a JavaScript browser app ?  You want your 'ajax' part to 
'piggy back' on the credentials the user entered to login ?The
( stored in the browser as cookies )
The reference to avoiding passing credentials and having to use the same port 
seems to indicate that.
If so, then it will be impossible to securely protect/restrict access to the 
REST API from all parts of the app,
by implication of sharing credentials.  So your 2 goals cannot be 
simultaneously achieved.

So focusing on how to simply expose your app in addition to REST -- very easy.
Create a new REST application for your combined app.
Then edit the generated rewriter.xml  (It will be in the Modules DB, the path 
to it in the App configuration in the <url-rewriter> element in groups.xml, or 
the corresponding "Rewriter URI" in the HTTP App config page on 8001.


It will look something like this:

<!-- Copyright 2011-2017 MarkLogic Corporation.  All Rights Reserved. -->
<rewriter xmlns="http://marklogic.com/xdmp/rewriter";>
    <!-- XDBC -->
      <match-path  any-of="/eval /invoke /spawn /insert">
       <dispatch xdbc="true">$0</dispatch>
      </match-path>
    <!-- XDBC -->
---------->>> ADD HERE
    <!-- REST Client API endpoints -->
    <match-path matches="^/?$|^/content/([^/]+)/?$">
....

Insert your own rules before he REST Client API rules.
A minimal example might be

       <match-path prefix="/myapp/myapi">
             <dispatch>/myapp/myapi.xqy</dispatch>
       </match-path>

That would dispatch any URL  like    /myapp/myapi/myfunction?query=abc   to 
invoke  the module /myapp/myapi.xqy


You can somewhat constrain 'external' use of the REST API by adding a custom 
Header or query param to your internal calls then matching those and 
dispatching to an error page if they don’t exist.
A minimal example.  Insert just before the <!-- REST Client API endpoints -->

     <match-header name="X-INTERNAL">

Then at the end a
     </match-header>

That will only allow REST calls which include the "X-INTERNAL" HTTP header.
How to do that will depend on what libraries your using.
Details on the XML rewriter :

https://docs.marklogic.com/guide/app-dev/XMLrewriter













From: general-boun...@developer.marklogic.com 
[mailto:general-boun...@developer.marklogic.com] On Behalf Of Rajesh Kumar
Sent: Wednesday, April 19, 2017 6:59 AM
To: general@developer.marklogic.com
Subject: [MarkLogic Dev General] custom Rest rewriter

Thanks David,

I can maintain two different ports as app and rest servers. But every time I 
want to call REST API i have to pass credentials for the request from app 
server , which I want to avoid by having both in same port.

I want to access endpoints ( app API or REST API) whenever header has token 
info except login page. I tried this using roxy hybrid and rest type, but 
didn't succeed.

Can you help me by sharing any rewriter which I can use to achieve this 
functionality.

Thanks & Regards,
Rajesh
_______________________________________________
General mailing list
General@developer.marklogic.com
Manage your subscription at: 
http://developer.marklogic.com/mailman/listinfo/general

Reply via email to