Phabricator AphrontRequest / Save Error Fix

By  on  

Working on Phabricator extensions has thrust me back into the world of PHP, a language I had only touched via WordPress plugins and blog themes over the past few years.  Despite being away from the language, I was able to jump back in fairly quickly and felt a small "back at home" comfort...until I realized Phabricator was not greatly documented and that I'd need to dive deep into the source code to figure out how to do just about every task.

One error that baffled me for a while was the following:

You are trying to save some data to Phabricator, but the request your browser made included an incorrect token. Reload the page and try again. You may need to clear your cookies.

I was trying to create and save a PhabricatorAuthTemporaryToken instance for the sake of allowing login via a third party service, and the request from that service to Phabricator was made in the background, so there was no PHCID because there was no session, thus the CSRF token was invalid.  Essentially I needed a way to write to Phabricator without a CSRF validation (via PHCID) step.  The solution was simple:

// Turn off CSRF check
$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
// Save token
id(new PhabricatorAuthTemporaryToken())
  ->setTokenResource($transaction_code)
  // ...
  ->save();
// Turn CSRF check back on
unset($unguarded);

AphrontWriteGuard::beginScopedUnguardedWrites() allowed me to turn of the CSRF check, save the token, and then turn the CSRF check back on via unset.  Short amount of code but took a long time to find!

I love that advanced libraries like Phabricator insist on these security checks without developers having to do so explicitly; I also love that turning off this check momentarily is easy.  I'll be sure to share more PHP / Phabricator tips as I run into problems!

Recent Features

Incredible Demos

  • By
    CSS Fixed Positioning

    When you want to keep an element in the same spot in the viewport no matter where on the page the user is, CSS's fixed-positioning functionality is what you need. The CSS Above we set our element 2% from both the top and right hand side of the...

  • By
    Introducing MooTools NextPrev

    One thing I love doing is duplicating OS functionalities. One of the things your OS allows you to do easily is move from one item to another. Most of the time you're simply trying to get to the next or the previous item.

Discussion

    Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!