C2DM/PHP

Diskussion i 'Frågor, support och diskussion' startad av Lavesson, 11 mar 2011.

  1. Lavesson

    Lavesson Infant Droid Medlem

    Blev medlem:
    11 mar 2011
    Inlägg:
    5
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej!

    Någon som arbetat med Google C2DM och fått det att fungera?
    Jag använder cURL i ett PHP-script för att skicka POST till C2DM-servern och har problem med att svaret enbart blir 401 - Unauthorized.

    Jag har inte tillgång till koden just nu, och innan jag börjar posta en massa kod tänkte jag först och främst se så att jag inte missuppfattat något grundläggande. Min arbetsgång är följande:

    1. Jag har satt upp ett role account hos google genom att fylla i formuläret på http://code.google.com/intl/sv-SE/android/c2dm/signup.html - Jag fick ett mail direkt om att jag blivit godkänd och att det skulle ta någon dag innan jag kunde börja använda det (gjorde detta för någon vecka sedan)

    2. Jag registrerar klienten och får ett registration id från Google - Detta gör jag på klientsidan (appen) med mitt role account. Svaret jag får är en lång id-sträng stil med APA91bGD... [nerkortad]

    3. Jag skickar strängen till PHP-scriptet på min server. Detta gör jag som en GET-variabel. Servern tar emot strängen korrekt och lagrar den i en MySQL-databas (tills jag stänger av push notifications i min app, då tas strängen bort igen)

    4. Jag använder cURL på servern för att skicka POST och få ett AUTH-token. Även här med mitt role account som jag satte upp.

    5. Servern får ett svar från Google med tre strängar: SID, LSID och Auth.

    6. Jag använder cURL för att skicka POST till C2DM-servern. POST:en innehåller en header med "Content-Length=..." och "Authorization: GoogleLogin auth=..." med motsvarande värden. Själva POST-värdena jag skickar med är:

    registration_id - Jag använder det ID som jag fick från klienten.
    collapse_key - (som jag, så vitt jag förstått efter att ha läst på http://code.google.com/intl/sv-SE/android/c2dm/index.html, kan han vilket värde som helst - Jag skickar bara med en md5 av mitt namn för att generera något värde)
    data.msg - Payload data. Ett väldigt kort meddelande till klienten

    7. Jag skickar POST:en och får svaret 401 - Unauthorized inom några sekunder.

    Som sagt: Gör jag något uppenbart fel? Jag har hittat många som haft problem med 401, men ingen lösning som fungerat för min del. Jag kommer att vara hemma om några timmar och postar gärna min kod om det behövs då.

    Tack!
    Eric Lavesson
     
  2. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 jun 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Dubbelkolla att du verkligen skapar din auth token korrekt. Jag höll en presentation om C2DM för ett tag sedan och sprang också på 401-problemet.

    Steg 4 som du beskriver är inte helt korrekt om du menar att du gör ett login request varje gång du ska skicka ett meddelande. Det normala är att du gör detta _en_ gång, helst utanför din server. Sen placerar du den token som returneras på servern och kollar sen responsen när du skickar meddelanden om du ska uppdatera din token.

    I mina slides nedan, finns curl-exempel på hur du tar fram en token och skickar meddelanden.

    Edit: Gick visst inte att lägga slidsen här direkt. Här finns dem iaf: http://www.slideshare.net/johannilsson/foss-sthlm-android-cloud-to-device-messaging
     
    Last edited: 11 mar 2011
    Lavesson gillar detta.
  3. Lavesson

    Lavesson Infant Droid Medlem

    Blev medlem:
    11 mar 2011
    Inlägg:
    5
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej.

    Tack för ditt svar!
    Nej, jag skapar enbart mitt Auth-token en gång. Just nu sparar jag mitt auth-token i en enkel textfil på servern. Om textfilen inte existerar så requestar servern ett auth-token och sparar det, därefter använder jag samma auth-token varje gång genom att läsa in det. Jag har ännu ingen mekanism för att uppdatera mitt token däremot (mer än manuellt genom att ta bort textfilen och tvinga servern att hämta ett nytt).

    Jag har sett att 401 ska betyda att auth är ogiltig. Är det när man får 401 som respons som man borde uppdatera sitt token? Samtidigt borde det ju fungera åtminstone direkt efter att jag fått det (om jag inte gör fel någonstans såklart)

    En liten fråga: Du säger att jag helst ska göra min LoginRequest utanför servern. Menar du ifrån klienten/appen i sådana fall? Vad är fördelarna med att göra det utanför?

    Stort tack för slidsen! Jag ska titta på dem senare idag när jag är hemma och har mer tid så att jag slipper stressa igenom det ;)
     
  4. RickardP

    RickardP Adult Droid Medlem

    Blev medlem:
    8 apr 2010
    Inlägg:
    515
    Mottagna gillanden:
    22

    MINA ENHETER

    Jag har precis i veckan fått igång C2DM med en AppEngine Java Servlet och det Johan menar med att man ska uppdatera sin auth token är att vid varje anrop när du skickar ett meddelande så finns det en header med namnet "Update-Client-Auth" som kan komma med och i den ligger den nya auth token du ska använda.

    Så vid varje anrop för skicka meddelande bör du kolla headern efter detta, finns ganska bra dokumenterat i dokumentationen om just den biten och om java kod skulle hjälpa så finns mitt test projekt på github, på denna länk hittar du koden där jag skickar meddelandet och tar emot denna updaterade auth token: https://github.com/RickardPettersson/appengine-c2dm-test/blob/master/src/com/rickardp/appengine/test/c2dm/AppEngine_C2DM_TestServlet.java#L76
     
  5. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 jun 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Nej jag menar inte att den ska skapas på klienten/appen, själv skapar jag den på min egna dator och placerar den manuellt på servern. Främsta anledningen till att göra det utanför servern är att du slipper distribuera användarnamn och lösenord för ditt konto istället har du endast en token för inloggning vilken du enkelt kan revoka om så skulle behövas. Själv sparar jag min token i en tabell, lite smart cache på det så blir det ingen overhead heller.
     
  6. Lavesson

    Lavesson Infant Droid Medlem

    Blev medlem:
    11 mar 2011
    Inlägg:
    5
    Mottagna gillanden:
    0

    MINA ENHETER

    Okej. Då förstår jag vad du menar. Det är en idé som jag absolut kommer att tillämpa.

    Jag upptäckte för övrigt igår kväll att jag kunde få allting att fungera om jag körde curl ifrån en terminal istället för att använda mitt PHP-script, så uppenbarligen gör jag något fel i libcurl+php när jag skickar - Så vitt jag kunde se igår så skickade jag dock med samma header och post-fält, så frågan är om jag glömt ställa in någon speciell option till curl i scriptet.

    Jag ska hem och felsöka idag däremot och se om jag kan hitta problemet.
    @johannilsson: Tack så mycket för både tips och dina slides. Jag fick lite bättre översikt med dem.
    @RickardP: Tack för kodlänken - Det hjälpte mycket att se hur någon annan gjort!

    Felet kvarstår, men jag har sett att jag kan få det att fungera, plus att jag i alla fall lokaliserat var felet ligger någonstans, så det är garanterat bara en tidsfråga nu innan jag får igång det.

    Tack för all hjälp!
    // Eric Lavesson