Hvordan skrive en OAuth Client å få tilgang til data på andre Applications


Ved hjelp av OAuth, kan en utvikler opprette en uavhengig app som har tilgang til brukernes kontoer på andre tjenester. For eksempel, lar Facebook utviklere lage spill der brukere av spillene kan legge til sine egne vegger på Facebook fra appen. Appen har ikke tilgang til brukerens legitimasjon, og dermed holde samspillet sikker, og brukeren kan når som helst tilbakekalle tillatelser gitt til app.

For å oppnå dette, Facebook og andre tjenester, inkludert Google og GitHub har implementert en OAuth service. Det er to sett med kode som er involvert: Koden kjører på OAuth leverandør (f.eks Facebook selv), og koden som kjører på OAuth-klient (f.eks et nettsted eller en applikasjon som lar deg logge inn med din Facebook-legitimasjon). Mellom disse to sett med kode, kan programmerere skrive OAuth klienter, f.eks nettsteder og programmer som lar folk logge inn med en leverandør som Facebook. Og det er det vi kommer til å dekke her.

Hvordan virker OAuth arbeid?
?

Dataene på de andre tjenestene er kjent som ressurs. For eksempel, la oss si at du skriver en mobil spill som lar brukerne dele sin score på sin Facebook-vegg. Deres vegg regnes som en ressurs. Eller appen kan få tilgang til brukerens profilbilde, kanskje for å bruke som et ikon for å dukke opp når du spiller andre brukere. Igjen er det bildet en ressurs. Fordi veggen og bildet tilhører brukeren, blir brukeren betraktes eieren ressursen. Eller antar du skriver en Linux-basert app som kan få tilgang til en brukers GitHub-konto, og lese brukerens hovedpunkter. De hovedpunkter er igjen vurderes ressurser

Det er tre involvert med OAuth parter:..

  • Sluttbrukeren
    I OAuth språkbruk, er brukeren kjent som ressurseier.

    Appen brukeren logger inn.
    Dette er programvare som fungerer som en klient av OAuth-protokollen. Derfor, i OAuth språkbruk, er det kjent som ressurs-klient. Ofte folk også kalle dette en OAuth søknad.

  • The OAuth leverandør, etter også kjent som ressurs server.

    For å gjøre alt dette arbeidet, utviklerne av OAuth ønsket å lage et system som beskytter personvernet til alle involverte parter. For eksempel, hvis din app skal få tilgang til en brukers vegg, ikke brukeren ønsker ikke å stole på din app for å redde sitt brukernavn og passord; ellers ondsinnede app utviklere kan lage en slik app bare for å stjele brukernavn og passord. I stedet gir OAuth et middel som en bruker kan gi appen tillatelse til å gjøre visse ting, som post til veggen, men ikke har frie tøyler med brukerens konto (som å sende ut e-poster og venneforespørsler). Og videre, kan brukeren tilbakekalle privilegiene til enhver tid.

    For å få til dette, OAuth system gir et enkelt sett med trinn. Først, her er fremgangsmåten fra perspektivet til en sluttbruker ved hjelp av en web-basert applikasjon:


      Du som sluttbruker, starte programmet og programmet sier at det ønsker å få tilgang til Facebook-kontoen.

      Hvis du er enig, åpnes et vindu som ber deg logge inn på Facebook. Vinduet vil også oppgi nøyaktig hva programmet er lov til å gjøre (for eksempel tilgang din venneliste og legge til din vegg).

    1. Nå når du bruker programmet, det vil legge til veggen på ulike tidspunkter.

      Men hvis du vil, kan du nekte visse tillatelser når du logger inn som innlegg på veggen din. Og videre, når du vil, kan du logge deg inn på din Facebook-konto, kan du gå til innstillingene for applikasjonen, og tilbakekalle programmets tilgang til veggen.

      Nå her er fremgangsmåten fra perspektivet til app-utvikler :


        Du, som web app-utvikler, lage en app som forteller brukeren det ønsker å få tilgang til brukerens Facebook-konto. Ved å gjøre det, angir du et sett med ressurser du ønsker å få tilgang til, som for eksempel å legge til veggen.

      1. Hvis brukeren samtykker, vil du sende brukeren til en Facebook innloggingsbildet . Påloggingsskjermen åpnes i nytt vindu og ber brukeren om å logge inn. Så siden spør om brukeren ønsker å gi appen tillatelse til å få tilgang til de ulike ressursene du har angitt. Vær oppmerksom på at hvis brukeren ble allerede er logget inn på Facebook i nettleseren, Facebook-innloggingsskjermen vil trolig bli hoppet over.

      2. Hvis brukeren logger på hell og aksepterer tillatelser, påloggingssiden vil omdirigere til en side på nettstedet ditt, og sende en kode tilbake til omdirigert siden.

        På web server (og ikke i nettleseren) bruker du denne koden og send en anmodning direkte fra webserveren til Facebook servere og be om å få koden konvertert til en token.

        Din web-server kan nå få tilgang til brukerens ressurser ved å inkludere at token i ulike RESTful forespørsler.

        ? Nå er det på tide å skrive noen kode som gjør at OAuth leverandør og OAuth klienten til grensesnittet. ? Noen mennesker kan trenge for å bygge en OAuth leverandør; hvis du gjør det, kan du finne eksempler andre steder ved å starte på OAuth to nettstedet. Merk at for denne artikkelen vi jobber med den nyere versjonen av OAuth, som er versjon 2.
        Skrive en OAuth Client

        Så la oss bygge en OAuth-klient. Dette er en app som lar brukerne å logge inn via en annen leverandør. For denne demoen, i stedet for å bruke Facebook, har jeg plukket GitHub som leverandør. Dokumentasjonen OAuth uttrykker vanligvis hva vår app skal gjøre slik: Vår app vil kunne logge inn GitHub på brukernes vegne. Men jeg tror som gir en litt skjev oppfatning av hva vi gjør; heller, jeg foretrekker å si at vår app lar brukerne administrere sine GitHub kontoer direkte fra app vår. Det er i hovedsak de samme, bare formulert på en måte som virker litt mer legitimt. (Men det bringer opp en faktisk bekymring angående legitimitet i at noen apps gjør faktisk føre til problemer på steder som Facebook. Et eksempel er å sende ut spillet forespørsler uten at personen vite at disse forespørslene kommer ut. Personen har godkjent at atferd når utgangspunktet logge inn på app via Facebook, så det er deres egen feil. Men de fortsatt vanligvis ikke er klar over at de gjør det.)

        GitHub gir flere ressurser vi har tilgang til. Du finner dem i deres API katalogen. OAuth passer inn i dette bildet ved å gi et tegn på at vi vil bruke i å få tilgang til API. Ved å bruke at token, vil vi være åpne bruker våre ressurser. Du kan se fra dokumentasjonen som vi kan bruke GitHub API for å oppnå stort sett alt vi kan gjennom GitHub nettstedet. Det betyr at hvis du er så tilbøyelig, kan du opprette en ny, forbedret nettsted som brukerne kan bruke for å håndtere sine egne GitHub repositories.

        OAuth-leverandører, inkludert GitHub, krever at du registrerer din søknad. Ved å gjøre dette, vil du bli gitt to unike koder: En klient-ID og en klient hemmelig. Hvert program du registrere får to slike unike koder. Klienten ID blir inkludert i samtaler appen gjør fra nettleseren. Denne koden er synlig for sluttbrukeren. Klienten hemmelighet, på den annen side, må holdes hemmelig, og du er ikke å sende den ned til nettleseren. Disse to kodene identifiserer søknaden din; så når du kombinerer dem med en token kan du identifisere din bruker. Og mellom alle tre, vil GitHub vet at samtalene er mest sannsynlig autentisk.

        La oss nå prøve det. Det er egentlig ikke så komplisert hvis du bare huske at OAuth er et middel for å oppnå en token som du kan ringe inn API på vegne av en bruker. Når du har det token i hånden, kan du fokusere arbeidet på faktisk bruker API. Så for dette eksempelet, kommer jeg til å fokusere på OAuth del og holde API del til et minimum. Deretter kan du bruke samme kode for å få tilgang til andre OAuth leverandører foruten GitHub

        Her er fremgangsmåten vi skal følge:.

        Trinn 1.
        Registrer app

        Trinn 2. Anmeldelser Skriv kode som lar en bruker logikk

        Trinn 3. Anmeldelser Skriv kode som henter token og deretter bruker token for å oppnå brukerens e- adresse fra GitHub og brukerens hovedpunkter.

        Men først, som en slags "step 0", må du velge ditt språk plattform og lage en forrett web app. Jeg har brukt node i det siste; så jeg kommer til å opprette en ekspress app node. For å gjøre det, lanserte jeg et skall inn i min web server og opprettet en ny katalog for min app; Da jeg løp:

         NPM installere uttrykkelig 

        etterfulgt av

         uttrykke --hbs -f 

        for å lage en ny app. Og til slutt jeg initialisert sine node moduler.

         NPM installere 

        Jeg så bemerket min web server domenenavn og at dette programmet skal kjøre på port 3000 på serveren

        Nå kan vi begynner den virkelige skritt
        Trinn 1:. Registrer App

        Først, sørg for at du er registrert med GitHub. (De fleste som leser denne artikkelen sannsynligvis allerede er!) Så ta turen over til GitHub utviklerprogrammer side:


        Klikk på knappen øverst til høyre, Registrer New Application
        .

        Velg et program navn. Deretter har en hjemmeside URL for søknaden din. Neste legge til en beskrivelse. Det er greit hvis det er ting som "MyFirstTestApp" og hva ikke. GitHub vet at folk er praktisere og lære. Til slutt trenger du et program tilbakeringing. Dette vil være en URL din app vil svare på etter at brukeren blir sendt tilbake fra påloggingssiden. Husk at applikasjonen vil først omdirigere dem til GitHub login og programtillatelser side; deretter etter å fylle det i, vil brukeren bli sendt tilbake til en side i programmet ditt. Det er den siden vi snakker om her. For meg, jeg bare brukt mitt domenenavn og: 3000 etterfulgt av /tilbakeringing. Hva det betyr for min web app er jeg må skrive koden min å svare på anropet tilbake /tilbakeringing. (Pass på når du fyller dette feltet i at du bruker hele URL, ikke bare /tilbakeringing.)

        Hvis du vil kan du legge til et bilde for søknaden din, men hvis du bare lage en test app Det er ikke mye grunn til det. Til slutt klikker du på den grønne Register Application knappen nederst på siden. Da vil du se et skjermbilde som dette:


        I øvre høyre er både klient-ID og klienten hemmelig (jeg redacted dem i skjermbildet, men du vil se heksadesimalsifre der). GitHub holder disse for deg og helst du ønsker kan du komme tilbake til denne siden for å se den. Bare gå tilbake til programmet siden og klikk deretter på søknaden din
        Trinn 2:. En påloggingsside

        Jeg skal bare gjøre noe raskt her siden vi fokuserer på OAuth og ikke hvordan du oppretter en vakkert -Utviklet side. Node uttrykkelig gir oss en standard indeksen siden, så jeg skal bruke det. Det står i utsikt katalogen og filen heter index.hbs. (HBS forlengelse refererer til styret, selv om jeg ikke bruker noen styret markup her.) Åpne opp index.hbs, utslette alt i den, og erstatte den med bare denne ene linjen:

         < a href="/https://github.com/login/oauth/authorize?client_id=abcdefghijklmnop&scope=user:email,gist">Login</a>

        but erstatte abcdefghijklmnop med din egen klient ID. (Bruk klient-ID og ikke klienten hemmelighet, da dette er HTML som blir sendt til brukerens nettleser og er synlig gjennom view-kilde.)

        Det er alt vi trenger for innloggingsbildet, og dette er nok å kjøre en rask test program. Gå videre og starte opp programmet ditt, og deretter åpne nettadressen i nettleseren din. Med den nyeste node express, kjører du det fra appens bin underkatalog, og ved å skrive www.


        Først i nettleseren du vil se påloggingsskjermen. Ikke noe fancy. Klikk på linken og du vil bli tatt til GitHub. Men husk: Nå har du kobler til GitHub som bruker av søknaden din, ikke som skaperen av programmet. Selv om du vil bruke din egen GitHub-konto, kan du gjøre dette hvis en venn er med deg og er villig til å logge inn på GitHub for deg. Nå avhengig av om du allerede er logget inn på GitHub, vil du se en GitHub innloggingsbildet først. Deretter ved innlogging vil du se på skjermen for å godkjenne søknaden (se bildet øverst i denne artikkelen.)

        Her du innvilge søknaden om tillatelse til å få tilgang til spesifisert. Nå ser tilbake på koblingen parametrene i vår HTML:

        CLIENT_ID = abcdefghijklmnop & omfanget = user: e-post, gist

        Den andre er de tillatelsene vi ber om. (Kunnskapsrike lesere kan legge merke til at en sluttbruker kan endre disse. Men sluttbrukeren ville bare være å endre rettighetene han eller hun gir oss for egne ressurser, så dette er ikke mye av en sikkerhet bekymring.)
        < p> Selv om vi ikke har tilbakeringing kode ennå, hvis du ønsker kan du gå videre og godkjenne søknaden. Men når GitHub sender oss tilbake til /tilbakeringing side, vil vi få en 404-feil. Det er ok; Vi kan enkelt tilbakekalle tillatelser og gjøre det over. Å tilbakekalle tillatelser, gå tilbake til utviklerprogrammer siden og klikk på autorisert kategorien Programmer. Du vil se din app oppført; klikker du på Opphev knappen ved siden av den. (Du vil sannsynligvis trenger å gjøre dette flere ganger mens utvikle en app, uansett, slik at du kan holde testing.)

        Nå la oss bygge tilbakeringing, og vi vil gjøres
        Trinn 3:. Bygg tilbakeringing

        Vår tilbakeringing vil hente en kode som ble lagt inn på URL som en parameter, og foreta en REST anrop til GitHub API-server for å få en faktisk token. (Dette ekstra trinnet er nødvendig for at token ikke gjøre veien tilbake til nettleseren, av sikkerhetshensyn.) Så når vi får token vi skal gjøre et API-kall for å få brukerens hovedpunkter. Så sender vi dem tilbake som JSON til nettleseren. Hvorfor JSON? Fordi du, som webutvikler, kan ta det derfra til å skrive på klientsiden Javascript-kode som styrer JSON og skaper en vakker grensesnitt. Jeg vil forlate den delen opp til deg.

        Hvis du vil legge tilbakeringing, kommer vi til å sette det inn i vår app hoved app.js side. Før vi ser på koden, sørg for at du forstår hvordan denne koden på din tilbakeringing vil bli henrettet. Brukerens nettleser vil bli omdirigert til GitHub brukernavn og tillatelser siden. Deretter ved suksess, vil GitHub siden omdirigere nettleseren tilbake til din egen tilbakeringing side, og inkludert i nettadressen for siden din vil bli en kode som brukes for å skaffe en token. Leseren vil se dette redirect fra GitHub side, og sende denne webadressen tilbake til webserveren. Når webserveren får forespørsel kan det se på koden og gjøre trinnene for å få et tegn, og deretter sette sammen en ny side, og sende den siden tilbake til nettleseren.

        Inne i app.js fil, vil du finne en funksjon for app.get ('/') som dette:

         app.get ('/', funksjon (req, res) {res.render ('index'); }); 

        som henter hovedindeksen siden. Sett inn følgende kode etter denne indeksen gjenfinning kode:

         app.get ('/tilbakeringing ", funksjon (req, res) {var postobj = {URI:' https://github.com/login/oauth /access_token '+' CLIENT_ID = abcdefghijklmnop & '+' client_secret = xyz1234567890 & '+' kode =? '+ req.query.code, overskrifter: {Godta: "application /json'}}; request.post (postobj, funksjon (err, resp, kroppen) {//husk å ta med mer robust feilkontroll Var resultat = JSON.parse (kroppen); if (result.error) {res.send (result.error_description || result.error); retur;} //Bruk denne token å liste brukerens GIST Var requestobj = {//URI: 'https://api.github.com/user/emails', URI: 'https://api.github.com/gists ', overskrifter: {Autorisasjon: "token" + result.access_token, «User-Agent': 'linuxcomtest1'}}; forespørsel (requestobj, funksjon (err, resp, kroppen) {res.send (kroppen); }); });}); 

        Nå før jeg glemmer å nevne, for å kunne bruke denne koden, må du legge til et par kreve uttalelser på toppen av filen. Sett disse to linjene etter de eksisterende krever linjene:

         Var forespørsel = krever ('forespørsel'); Var spørrestrengen = krever ('spørrestrengen'); 

        Deretter lagrer du filen og gå ut av redaktøren . Ved ledeteksten, må du legge til forespørselen pakken slik:

         NPM installere forespørsel 

        Dette legger til HTTP-forespørsel biblioteket slik at du kan gjøre forespørselen samtaler i koden du la til. Nå tilbake til koden.

        Det første denne koden gjør er å sette sammen en forespørsel om å forvandle den innkommende kode i en autorisasjonskode. Bytt abcdefghijklmnop med din egen klient id, og erstatte xyz1234567890 med din egen klient hemmelighet. Koden parameter kommer med den innkommende URL som fikk oss her; denne koden ble fylt ut av GitHub. Det er alt vi trenger, så vi ringe til https://github.com/login/oauth/access_token, som er nettadressen for å få en token. Jeg har også tatt med en Godtar header ber application /json, selv om jeg ikke prøve det med noe annet. Du trenger kanskje ikke den delen. Denne koden gjør så en telefon fra vår server til GitHub servere. Brukerens nettleser gjør ikke denne samtalen. I vårt svarkode, får vi tilbake en haug med JSON. Den kommer i en streng, så vi analysere den. Hvis noe gikk galt, vil det JSON være et objekt som inneholder en feil medlem og en melding. Jeg er bare å sende den tilbake til klienten for nå å holde dette eksemplet enkelt.

        Ellers, hvis alt gikk bra, har vi nå en token. Dette token tillater oss å gjøre API-kall på brukerens vegne. Nå er vi klare til å gjøre en annen samtale til GitHub servere. Denne er enkel; Jeg bare spør for brukerens hovedpunkter. Hvordan vet jeg URL for dette på? De er alle oppført i GitHub API dokumentasjon. Her er doc side for GIST.

        Legg merke overskriftene jeg følger med denne samtalen. Denne gangen er de ikke valgfritt. Du må ta med token formatert som ordet "token" etterfulgt av et mellomrom etterfulgt av selve token. Den neste overskriften er spesifikk for GitHub; de ber om at vi har en User-Agent header består av vår søknad navn. Det er bare for å hjelpe dem med deres logging og støtte. (Hvis du ikke tar med det du får tilbake en feilmelding i stedet for dataene du vil.)

        Når dette GIST forespørsel avkastning, jeg bare sende resultatene tilbake til nettleseren. Det er bare en haug med JSON, og du kan finne ut hvordan du ønsker å fortsette neste.

        Nå i koden jeg også tatt med et eksempel som får brukerens e-postadresse som er registrert hos GitHub. Du kan prøve det også ved uncommenting den linjen og kommentere ut linjen som følger.
        Avslutt med API-kall

        Det er omtrent det! OAuth er egentlig bare brukes for å skaffe et token for brukeren. Etter det er det bare business as usual ved å gjøre API-kall. En ting jeg viste ikke var hvordan å gjøre gjentatte samtaler. Det funker bra også, bortsett fra på det punktet du allerede har tegnet og trenger å gjenbruke det. Hvordan gjør du det? Vel, det er opp til deg. Du kan lagre den i en database på serveren din hvis du vil. Du ønsker ikke å lagre den i en cookie, fordi du ikke ønsker å sende den tilbake til brukeren, med mindre du kryptere cookie. Hvor du skal neste? Utforsk API og prøve ut flere samtaler. Og så prøve å jobbe med noen andre tjenester som også bruker OAuth. Så ha det gøy! Anmeldelser