Meta tags:
description= Programming and whatnot;
Headings (most frequently used words):
and, the, in, akka, up, to, papertrail, adventures, dependency, injection, your, it, tim, gilbert, blog, logging, from, headless, nerves, machines, client, side, routing, with, re, frame, oauth, wrote, thing, cljs, datepicker, authentication, state, single, page, apps, clojurescript, yet, another, language, three, quick, scala, plugs, more, on, testing, actors, mocks, cbfix, recent, posts, archives, categories, meta, sign, for, add, loggerpapertrailbackend, library, dependencies, configure, logger, set, environment, build, deploy, firmware, fire, watch, logs, tone, down,
Text of the page (most frequently used words):
the (361), and (137), this (66), for (56), with (52), that (47), you (47), which (44), akka (38), page (37), from (36), but (36), actor (36), timgilbert (30), have (28), user (27), will (26), can (26), #papertrail (25), 2013 (24), not (23), scala (22), one (22), actors (22), there (22), into (22), app (22), more (21), system (21), dependency (21), injection (21), then (21), posted (20), frame (18), url (18), like (17), about (17), way (17), database (17), out (17), com (16), state (16), single (16), service (16), when (16), foursquare (15), token (15), wordpress (14), clojure (14), client (14), side (14), are (14), using (14), your (14), clojurescript (13), work (13), back (13), message (13), seems (13), has (13), time (13), library (13), routing (12), oauth (12), nerves (12), been (12), lot (12), still (12), interface (12), project (12), new (12), code (12), what (12), need (12), two (12), set (12), logs (12), stuff (11), all (11), how (11), get (10), site (10), log (10), https (10), permalink (10), post (10), just (10), see (10), probably (10), some (10), since (10), route (10), firmware (10), blog (9), tagged (9), them (9), test (9), particular (9), things (9), worker (9), want (9), little (9), localstorage (9), callback (9), 2015 (8), authentication (8), having (8), would (8), something (8), http (8), bit (8), also (8), most (8), pretty (8), recently (8), its (8), application (8), should (8), elixir (7), thing (7), comment (7), days (7), use (7), don (7), above (7), mock (7), data (7), note (7), needs (7), make (7), any (7), existing (7), they (7), different (7), was (7), seem (7), itself (7), after (7), pattern (7), over (7), event (7), easy (7), reagent (7), now (6), javascript (6), haunting (6), refrain (6), another (6), working (6), framework (6), source (6), these (6), few (6), object (6), passing (6), might (6), look (6), really (6), web (6), doesn (6), control (6), found (6), interesting (6), between (6), could (6), date (6), build (6), popup (6), redirected (6), authenticate (6), uses (6), home (6), she (6), server (6), api (6), debug (6), export (6), view (5), sign (5), december (5), 2012 (5), march (5), july (5), august (5), yet (5), adventures (5), logging (5), leave (5), related (5), though (5), open (5), say (5), come (5), spring (5), solution (5), works (5), here (5), via (5), pass (5), than (5), based (5), off (5), being (5), current (5), flow (5), sort (5), approaches (5), very (5), running (5), well (5), while (5), had (5), published (5), cake (5), least (5), github (5), because (5), browser (5), spotify (5), component (5), directory (5), access (5), config (5), mdns (5), console (5), environment (5), logger (5), tim (4), gilbert (4), comments (4), create (4), november (4), may (4), 2016 (4), 2017 (4), language (4), apps (4), cljs (4), headless (4), only (4), does (4), around (4), without (4), subject (4), etc (4), everything (4), root (4), reference (4), notification (4), row (4), sends (4), gets (4), right (4), winds (4), doing (4), java (4), once (4), run (4), simple (4), table (4), actually (4), testing (4), mocks (4), across (4), approach (4), other (4), management (4), bits (4), down (4), somewhat (4), actorref (4), case (4), hello (4), order (4), previous (4), far (4), seen (4), form (4), points (4), along (4), best (4), online (4), excellent (4), great (4), quite (4), writing (4), target (4), hits (4), essentially (4), history (4), entry (4), sure (4), picker (4), add (4), matching (4), local (4), raspberry (4), mix (4), name (4), development (4), started (3), design (3), already (3), account (3), random (3), python (3), september (3), april (3), wrote (3), datepicker (3), machines (3), posts (3), cbfix (3), several (3), mostly (3), haven (3), public (3), currently (3), bunch (3), needing (3), read (3), connect (3), constructor (3), methods (3), long (3), maybe (3), later (3), messages (3), every (3), production (3), each (3), finds (3), including (3), request (3), error (3), point (3), good (3), think (3), got (3), model (3), idea (3), where (3), rest (3), job (3), particularly (3), technical (3), known (3), much (3), testkit (3), talk (3), problem (3), systems (3), last (3), part (3), kuhn (3), find (3), worth (3), interested (3), helpful (3), their (3), same (3), actorsystem (3), dest1 (3), dest2 (3), val (3), probe1 (3), probe2 (3), first (3), instead (3), makes (3), useful (3), document (3), firstly (3), secondly (3), before (3), means (3), thinking (3), quick (3), three (3), his (3), written (3), core (3), async (3), programming (3), deal (3), instructions (3), keeping (3), trying (3), straightforward (3), redirect (3), persists (3), storage (3), value (3), navigate (3), persist (3), html5 (3), provider (3), arbitrary (3), full (3), authorization (3), check (3), own (3), spent (3), builds (3), pages (3), atom (3), updates (3), pikaday (3), eventual (3), track (3), handler (3), pushy (3), keyword (3), setup (3), level (3), logger_papertrail_backend (3), configuration (3), push (3), nerves_init_gadget (3), below (3), papertrail_url (3), hostname (3), port (3), output (3), loggerpapertrailbackend (3), phoenix (3), bar (2), manage (2), subscriptions (2), content (2), subscribed (2), subscribe (2), feed (2), meta (2), recent (2), completely (2), managed (2), cbr (2), cbz (2), script (2), wit (2), files (2), mess (2), replace (2), slick (2), include (2), software (2), clear (2), logic (2), properly (2), despite (2), obvious (2), arguments (2), prestart (2), struggling (2), minutes (2), successful (2), ask (2), update (2), mark (2), relevant (2), delivered (2), represent (2), diagram (2), line (2), supervision (2), hierarchy (2), simplifies (2), those (2), sub (2), talking (2), needed (2), handle (2), likely (2), per (2), send (2), purpose (2), users (2), someone (2), put (2), method (2), interest (2), ones (2), checks (2), services (2), year (2), overall (2), lifecycle (2), inversion (2), suggests (2), breaking (2), models (2), similar (2), question (2), entire (2), presentation (2), dependent (2), real (2), mean (2), receive (2), takes (2), parameters (2), class (2), mydoubleecho (2), var (2), def (2), testprobe (2), props (2), ref (2), expectmsg (2), 500 (2), millis (2), documentation (2), either (2), initialization (2), result (2), docs (2), become (2), official (2), expected (2), small (2), proper (2), know (2), locator (2), parts (2), factory (2), instantiation (2), head (2), tell (2), integration (2), anything (2), purely (2), section (2), convinced (2), whole (2), topic (2), thought (2), main (2), expose (2), specific (2), returns (2), sending (2), kind (2), internet (2), large (2), concurrency (2), plugs (2), distractions (2), until (2), john (2), sense (2), won (2), isn (2), ready (2), next (2), stable (2), topics (2), style (2), too (2), ago (2), building (2), multi (2), old (2), figuring (2), gave (2), slides (2), spare (2), end (2), websockets (2), figure (2), problems (2), situation (2), popups (2), mobile (2), browsers (2), less (2), experience (2), honestly (2), second (2), fire (2), parent (2), window (2), however (2), considerable (2), button (2), react (2), thanks (2), auth (2), replacestate (2), landing (2), general (2), dom (2), against (2), number (2), embedded (2), link (2), projects (2), structure (2), fine (2), relies (2), impressive (2), dispatch (2), adequate (2), basically (2), separate (2), develop (2), template (2), basic (2), actual (2), lein (2), file (2), wound (2), sibiro (2), datascript (2), posh (2), locally (2), reasonably (2), complex (2), constructing (2), fairly (2), effect (2), coeffect (2), pulls (2), during (2), refresh (2), whenever (2), both (2), pleased (2), parses (2), renders (2), changed (2), values (2), big (2), given (2), external (2), burn (2), settings (2), info (2), cli (2), events (2), variable (2), typically (2), card (2), deploy (2), ssh (2), rpi (2), under (2), mix_target (2), wifi (2), logsx (2), papertrailapp (2), variables (2), distinguish (2), nicely (2), exs (2), deps (2), free (2), erlang (2), whatnot (2), collapse, reader, report, privacy, entries, album, cover, hexmap, categories, 2011, february, archives, search, older, cbrfix, busy, weeks, universe, disregarding, sphere, utility, scaffolding, presents, possibilities, meantime, coffeescript, simmering, burner, extensions, reasonable, oracle, typesafe, inc, burning, desire, sell, workers, addition, closed, commercial, mixing, business, nodes, yellow, objects, verify, articles, correct, instantiate, decently, refer, tick, sent, seconds, causes, polldatabase, includes, notify, httpclient, composes, makerequest, pool, performs, requestsucceeded, thread, successfully, requestfailed, continue, scheduler, gist, arrows, positive, exist, versus, suppose, rough, sketch, pardon, par, omnigraffle, skills, hard, translate, coordinating, supervisor, restart, calls, spawn, individual, success, completed, failure, die, deliver, notifications, subsystem, pick, hand, heavy, lifting, implemented, quartz, cron, kick, polling, swiftly, mercurial, ever, present, employer, shop, minded, notion, prototype, rewrite, simpler, periodically, rows, fires, json, formatted, delivery, response, wrinkles, locking, involved, basics, possessed, integrating, merit, ran, describes, autowiring, promising, course, assumes, separating, creation, literature, posit, integrated, feature, let, crash, maxim, features, direct, opposition, notions, founded, discrete, trees, locators, take, watching, starts, terribly, difficulty, injecting, wrong, hear, looking, mentions, third, option, path, naming, supplant, implementations, locations, roland, introducing, pollutes, belong, dest, extends, actorof, various, suggest, wiring, together, instance, creating, referring, switch, states, latter, example, digging, described, partially, arises, unclear, mode, words, obtain, inject, half, formed, involves, responsible, jibe, coupled, tightly, addressed, likes, explicitly, lifecycles, supervise, room, hallmark, frameworks, place, concrete, terms, partial, supervises, live, integrate, synchronous, usable, inside, unfortunate, final, aimed, squarely, recalcitrant, middle, managers, who, move, legacy, tossed, incredibly, myself, typed, injected, knows, attach, context, support, convenient, singleton, graph, regular, facade, futures, resulting, actorrefs, mentioned, emphasize, expert, practices, addresses, concerns, intersection, larger, falls, outside, camp, follow, weirdly, expressed, mini, white, paper, issued, rfp, regarding, finally, following, daniel, spiewak, keynote, nescala, made, compiler, enforced, module, implementation, interestingly, examples, eschews, self, types, exception, virtual, bakery, black, lagoon, treatment, required, reading, anyone, months, somehow, missed, instant, intuitive, coming, background, unfortunately, depends, macro, mainline, prime, rewritten, road, macros, reach, describing, video, scaladays, congeal, sullivan, covering, many, enjoyable, chapter, profoundly, absorbed, refreshingly, month, pad, length, learn, remedial, material, anyways, recommend, thoroughly, derek, wyatt, book, reliable, world, longish, distracted, refactoring, ultimately, hope, ring, straight, acme, productivity, story, deep, land, wanted, plug, sharing, aesthetic, ideals, immutability, interoperability, jvm, platform, group, deck, markdown, asciidoc, introduction, regularly, filled, game, capability, shoehorn, natural, fit, kit, installment, dig, deeper, generally, iframe, address, validate, phishing, ick, iframes, suck, feel, native, desktop, tend, block, invoked, thank, god, tag, experiments, triggered, blocker, _blank, original, trundle, waiting, drawbacks, comes, sets, closes, trigger, updating, chooses, arrives, empty, stashes, information, refreshes, cookies, sessionstorage, shiny, said, viable, complicates, managing, reflected, destroyed, leaves, upon, return, sum, total, her, consist, manageable, our, stash, somewhere, modify, problematic, disappear, trickier, stay, refreshing, accumulates, effectively, navigates, indeed, term, twitter, stack, grab, cookie, mechanisms, rate, exists, prompted, authorize, arrive, requests, subsequently, forth, tried, plain, combination, simplicity, abstraction, taste, sometimes, feeling, backbone, raises, why, neat, definitely, crazy, ways, channels, communicate, components, fairness, amount, partly, tutorials, esoteric, spending, released, frpish, unidirectional, top, almost, theoretically, served, static, html, lives, modifying, logical, vogue, fragment, puzzling, humane, easily, express, listen, perfect, atoms, synchronized, selection, change, selected, selector, worked, websites, spawned, templates, past, shockingly, publish, clojars, caveat, artifact, didn, jar, extraneous, easiest, starting, getting, functionality, moving, generated, save, clj, plan, demo, today, messing, pickers, enough, seemed, worthwhile, packaging, reframe, workframe, hiring, buggy, heck, deployed, anywhere, runnable, happy, difficult, encoding, bespoke, fsm, fantastic, display, tinker, persisting, returned, write, seed, previously, retrieved, tokens, invocations, hodgepodge, seeing, construct, scratch, theory, store, volatile, going, cut, earlier, version, wiped, declarative, cheating, hit, allow, associated, blank, mounted, saves, redirects, index, dispatches, keep, called, keeps, whether, clicked, redirecting, subscription, params, largely, whose, readme, risk, developing, migraine, define, keywords, used, render, talked, difficulties, dealing, obtained, solve, quickly, count, bashing, guess, progress, direction, intriguing, tech, mike, thompson, greatest, living, essayist, package, elm, redux, frp, squint, vein, retain, domain, focused, wire, elements, disadvantages, company, urge, hack, interim, diminishes, downtime, anxiety, week, revived, ideas, playlist, places, verified, connection, aren, drowning, ideally, else, tone, ingesting, realtime, prefer, happen, handy, power, wait, show, viewer, watch, onto, inserting, popping, hassle, viewing, tools, yours, profile, rpi3, nerves_network_ssid, ssid, netowrk, nerves_network_psk, password, papertrail_api_token, yyyyy, narwhal, practice, mine, looks, fake, signed, applications, connected, sink, vary, dev, servers, xyzzy, storing, plugging, compile, corresponds, controls, targets, submitting, udp, require, key, hopefully, prevent, joe, chatty, chatter, modules, care, get_env, format, metadata, backends, configure, added, terminal, therefore, standard, cycle, machine, destination, dependencies, gives, shows, install, shouldn, forwarding, syslog, noting, poncho, recommended, contains, parallel, containing, latest, versions, potential, roadblock, remote, device, especially, poking, ships, aggregation, tier, anybody, hobbyist, learning, excited, image, boots, directly, beam, traditional, strengths, controlling, led, grid, hardware, interfacing, functional, ale, unicorn, hat,
Text of the page (random words):
r logger_papertrail_backend url system get_env papertrail_url level debug format metadata message config logger backends console loggerpapertrailbackend logger level debug two things to note here we re sending debug logs to papertrail this is helpful to get started but a lot of the debug output from nerves is more chatty than useful in particular you ll see a lot of chatter from the nerves_init_gadget mdns server and the wifi modules that you probably won t care about we re storing the actual papertrail url in an environment variable and then plugging it into the configuration at compile time this corresponds nicely with how nerves controls what targets you build for via environment variables mix_target etc submitting logs to papertrail over udp doesn t seem to require an api key so keeping the hostname and port out of your public source code will hopefully prevent joe internet from writing stuff to your logs set up your environment this is basically as simple as export papertrail_url papertrail logsx papertrailapp com xyzzy my name here we re constructing a fake url with the hostname and port that papertrail gave us after we signed up the my name bit can be anything you want papertrail uses it to distinguish different applications connected to the same log sink you d probably want to vary this name to distinguish between production and dev builds different servers of a multi server system etc in practice i ve got a file in my home directory nerves build which i source in order to set up environment variables i need to build the firmware mine currently looks something like this export mix_target rpi3 export nerves_network_ssid the ssid to my wifi netowrk export nerves_network_psk the password for the same export papertrail_api_token my papertrail api token see below export papertrail_url papertrail logsx papertrailapp com yyyyy narwhal rpi about the papertrail api token it s not actually needed on the pi itself but it s useful for viewing logs in the console via papertrail s cli tools see below you can find yours on the papertrail site under settings profile build and deploy the firmware given the above environment variable setup building the firmware is as easy as running mix firmware from the fw directory you would typically then get it onto the pi by inserting an sd card running mix firmware burn and popping the sd card into your pi if you have nerves_init_gadget set up you can instead deploy over ssh by using mix firmware push my rpi mdns name local which is less of a hassle fire it up and watch the logs you re ready to go connect the power and wait for some logs to show up in the papertrail event viewer with the above configuration you should at least see some mdns debug events in there if everything is working properly papertrail also has a handy cli interface you can use to see the logs it s ingesting in realtime if you prefer a console ui to a web ui you ll need to set up the api token as above then you can just use papertrail f to view your logs as they happen tone it down once you ve verified that the connection works you ll likely want to set the log level of your logger_papertrail_backend config settings back to info so you aren t drowning in mdns logs actually ideally you d want debug logs from your own application and info logs from everything else i m sure there s a way to do this but i m not sure how to do it quite yet 1 comment by timgilbert on december 31 2017 permalink posted in elixir tagged elixir nerves papertrail raspberry pi posted by timgilbert on december 31 2017 https timgilbert wordpress com 2017 12 31 logging from headless nerves machines to papertrail adventures in client side routing with re frame and oauth it s been a while since my last post one of the few disadvantages of working at a company you like a lot is that as your work projects get more interesting the urge to hack on external stuff in the interim diminishes but having had some downtime and considerable anxiety to burn off in the last week or two i revived one of my old open source ideas haunting refrain a little single page app that gets your foursquare check in history and then builds a random spotify playlist out of random data from the places you ve been to this is still very much a work in progress but i m pretty pleased with its direction and it uses a lot of intriguing tech it s all written in clojurescript and it uses re frame for the basic single page app control flow and ui bits re frame was written by mike thompson probably clojure s greatest living essayist and is an excellent package somewhat in the elm redux frp if you squint vein i m also now using datascript to retain more domain focused data and posh to wire it up to the ui elements about which more later in a previous post well over a year ago now i talked about some difficulties i was having with dealing with external oauth style authentication in single page apps having obtained a great deal more experience with client side routing since then i managed to solve this fairly quickly in haunting refrain if you don t count the time i spent bashing my head against similar problems while at work as trying to figure it out i guess my current set up uses pushy to handle the html5 history setup and sibiro as a routing library largely because it s the only client side routing library whose readme i can read without the risk of developing a migraine honestly client side routing should not be very complex what s the deal i define a big route table which uses keywords for every route each entry has a url matching pattern and a reference to a reagent component which will be used to render the given page on the re frame side i keep a value in the app db called route current page which keeps track of the keyword matching the current url whenever the url has been changed whether by the user landing on the page for the first time or from a link being clicked or the app itself redirecting the user pushy will dispatch a new re frame event of the form route changed route keyword route params if any the handler for that route just persists those two values in the app db and then in the view code there s a subscription which pulls out the two values checks the big route table for the component matching the current route keyword and renders the component passing it the page parameters in case it needs them so that bit is pretty straightforward and i m pleased with how declarative the routing table winds up for the spotify and foursquare oauth callback pages i m cheating a little bit when the user needs to authenticate he or she will be redirected to foursquare will hit the allow access button and will then be redirected back to a specific callback url on haunting refrain back on the site pushy parses the callback url as foursquare hello and the component which is associated with that route renders a blank page and dispatches an event when it is mounted into the dom the handler for this event parses the oauth access token out of the url saves it in the app db persists it into html5 localstorage and then redirects the user back to the home page at main index the localstorage bit is an interesting side track since the user winds up seeing a full page refresh whenever he or she is redirected for authorization the application essentially has three entry points where it needs to construct the user s state from scratch on the home page and then on the authorization callback pages for both spotify and foursquare since in theory we need to store access token for both services the volatile re frame app db is not going to cut it in an earlier version of the application you could authenticate to foursquare get an access token then authenticate to spotify at which point a full page refresh wiped out the foursquare token persisting stuff to localstorage wound up being pretty easy and relies on the new re frame effect and coeffect system i have a re frame effect persist which when returned from an event handler will write a value to the browser via the hodgepodge library a matching local storage coeffect pulls it out of the browser and i m using this during app initialization to seed the database with any previously retrieved access tokens this works great and should make it quite easy to persist arbitrary data across application invocations overall i m quite happy with re frame i ve found that it can be a little difficult to track the control flow once a system gets reasonably complex since you re essentially encoding most of it by means of constructing a large bespoke fsm but it does a fantastic job of keeping the control flow and display logic separate and it is fairly easy to tinker with i ll have more to say about haunting refrain in the days to come the routing stuff isn t actually one of the more interesting parts of it the datascript and posh bits are the thing is still buggy as heck and not deployed anywhere but it s runnable locally check it out workframe we re hiring leave a comment by timgilbert on november 27 2016 permalink posted in clojure haunting refrain tagged clojure clojurescript localstorage re frame routing sibiro single page app posted by timgilbert on november 27 2016 https timgilbert wordpress com 2016 11 27 adventures in client side routing with reframe and oauth i wrote a thing cljs datepicker i spent a little time today messing with date pickers for my eventual single page app and wound up with something general enough that it seemed worthwhile packaging it as a library to wit i published cljs pikaday a clojurescript interface to the pikaday javascript date picker so far it just has a reagent interface but i still plan to add an om interface and a re frame interface at least you can see an online demo at github after having worked with a lot of websites spawned from lein new templates in the recent past i found the eventual project clj file for the library to be shockingly small it winds up being very easy to publish a library on clojars as a caveat i still need to test the published artifact in a separate project to make sure i didn t mess everything up i know my published jar has an extraneous directory in it for one thing i found the easiest way to develop the library was by starting with a lein new reagent template getting the basic functionality to work and then moving the generated stuff into its own template save the actual library files the interface itself seems to be adequate for my needs if not perfect you can basically pass arbitrary atoms in to the pikaday date selector component and have the date picker synchronized with the atom so that user selection updates the atom and atom updates change the selected date of the picker i m still puzzling over what a humane re frame interface would look like one could easily dispatch methods using the existing callback interface but i m not really sure what the best way to express subscriptions that the picker should listen to is 1 comment by timgilbert on april 3 2015 permalink posted in clojure tagged cljs datepicker clojure clojurescript re frame reagent posted by timgilbert on april 3 2015 https timgilbert wordpress com 2015 04 03 i wrote a thing authentication state and single page apps in clojurescript i ve been spending a lot of time recently working on a single page app in clojurescript most recently using the recently released and impressive re frame project which builds an frpish unidirectional data flow on top of the clojurescript react interface reagent by a single page app i mean one with almost no server side code which could theoretically be served from a static html page and which only lives at a single url modifying the fragment part of the url to navigate between logical pages in the app as is the vogue these days i ve tried out a few different approaches to writing this app including with om and plain reagent and re frame seems to have just the right combination of simplicity and abstraction for my taste with reagent i sometimes get the feeling i ve had in backbone javascript projects that there s not really very much structure in the framework and i have to make a lot of stuff up on my own which is fine but raises the question of why i m using a framework at all om seems pretty neat and definitely has a structure to it but i m not crazy about the ways it relies on async channels to communicate things between components in fairness i ve probably spent the least amount of time with om partly because the tutorials for it seem a little esoteric at any rate the app as it currently exists is pretty simple there is a home page from which the user is prompted to log into an oauth service in my case foursquare when the user hits the link he or she will be redirected to foursquare to authorize my app after which he or she will arrive back at my site with an authorization token in the url this is the callback url cf foursquare i need the token in order to pass it along to foursquare for api requests i subsequently make to get the user s check in history and so forth with a full stack application this would be pretty easy my server side code could look for the callback url and when it s found it could grab the token redirect the user to a known thanks for logging in page and pass the token along to the user s browser in a cookie or embedded on the page or though any number of other well known server browser mechanisms with a purely client side app however the situation is trickier in general the user is expected to stay on a single web page the entire time he or she is using the app without refreshing application state sort of accumulates over time in the dom and javascript object models on the page but since the user needs to redirect to foursquare s site in order to authenticate my application now effectively has two entry points one when the user first navigates there and one when the user returns from authentication indeed since in the long term i want my app to authenticate against at least one more oauth service and probably several spotify twitter etc it will have an arbitrary number of entry points this complicates managing user state since the user s previous state as reflected in the page s object model will be completely destroyed when he or she leaves the site for authentication upon the user s return the sum total of his or her state will essentially consist of the callback url including the authentication token this is somewhat manageable with a single oauth provider when the user hits the callback url our client side code can stash the token in the page s object model somewhere and then use something like history replacestate to modify the url back to the landing page with more than one oauth provider this approach is problematic since the state will disappear when the user hits the second provider so we need a way to persist information between page refreshes the two most obvious methods are cookies and html5 localstorage and i will be using localstorage or sessionstorage because it is...
|