background image
background image

Tytuá oryginaáu: Programming Social Applications: Building Viral Experiences with OpenSocial, OAuth, 
OpenID, and Distributed Web Framework

Táumaczenie: Mikoáaj Szczepaniak

ISBN: 978-83-246-3944-1

© 2012 Helion S.A.

Authorized Polish translation of the English edition of Programming Social Applications, 1st Edition ISBN 
9781449394912 © 2011 Yahoo!, Inc.

This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all 
rights to publish and sell the same.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, 
electronic or mechanical, including photocopying, recording or by any information storage retrieval system, 
without permission from the Publisher.

Wszelkie prawa zastrzeĪone. Nieautoryzowane rozpowszechnianie caáoĞci lub fragmentu niniejszej 
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, 
fotograficzną, a takĪe kopiowanie ksiąĪki na noĞniku filmowym, magnetycznym lub innym powoduje 
naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki wystĊpujące w tekĞcie są zastrzeĪonymi znakami firmowymi bądĨ towarowymi ich 
wáaĞcicieli.

Wydawnictwo HELION doáoĪyáo wszelkich staraĔ, by zawarte w tej ksiąĪce informacje byáy kompletne
i rzetelne. Nie bierze jednak Īadnej odpowiedzialnoĞci ani za ich wykorzystanie, ani za związane z tym 
ewentualne naruszenie praw patentowych lub autorskich. Wydawnictwo HELION nie ponosi równieĪ 
Īadnej odpowiedzialnoĞci za ewentualne szkody wynikáe z wykorzystania informacji zawartych w ksiąĪce.

Wydawnictwo HELION
ul. KoĞciuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (ksiĊgarnia internetowa, katalog ksiąĪek)

Pliki z przykáadami omawianymi w ksiąĪce moĪna znaleĨü pod adresem: 
ftp://ftp.helion.pl/przyklady/prapse.zip

Drogi Czytelniku!
JeĪeli chcesz oceniü tĊ ksiąĪkĊ, zajrzyj pod adres 
http://helion.pl/user/opinie/prapse
MoĪesz tam wpisaü swoje uwagi, spostrzeĪenia, recenzjĊ.

Printed in Poland.

• 

Kup książkę

• 

Poleć książkę 

• 

Oceń książkę 

• 

Księgarnia internetowa

• 

Lubię to! » Nasza społeczność

background image

5

Spis tre!ci

S#owo wst$pne  ............................................................................................................ 15

 1.  Podstawowe poj$cia zwi%zane z kontenerem aplikacji spo#eczno!ciowych ........... 21

Czym jest kontener aplikacji spo.eczno/ciowych? 

22

Profil u5ytkownika 

23

Znajomi i powi8zania u5ytkownika 

24

Strumie: aktywno/ci u5ytkowników 

24

Implementacja zastrze5onych i otwartych standardów 

25

Implementacja zastrze5ona 

25

Implementacja typu open source 

26

Dlaczego w tej ksi85ce zostan8 omówione otwarte standardy? 

27

Wbudowana aplikacja — tworzenie rozwi8za: w ramach czarnej skrzynki 

27

Wbudowane zabezpieczenia aplikacji 

29

Ataki XSS 

30

Zasada tego samego pochodzenia i starsze przegl8darki 

30

Pobieranie plików bez wiedzy u5ytkownika 

31

Zabezpieczanie aplikacji 

31

Aplikacja zewnHtrzna — integracja danych serwisu spo.eczno/ciowego

poza kontenerem 

31

Widoki aplikacji 

32

Widok domowy (ma.y) 

33

Widok profilu (ma.y) 

34

Widok kanwy (du5y) 

35

Domy/lny widok (dowolny) 

36

Zagadnienia zwi8zane z uprawnieniami aplikacji 

37

Aplikacje strony klienckiej kontra aplikacje serwera 

38

Stosowanie systemów szablonów w warstwie znaczników 

38

Stosowanie mieszanego /rodowiska serwera i klienta 

39

OpóMnianie .adowania mniej wa5nej tre/ci 

40

Kiedy dobra aplikacja okazuje siH z.a? 

40

Przeno/na aplikacja z animacjami 

41

Niedopracowany widok 

42

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

6

 

 Spis tre!ci

Aplikacja kopiuj8ca widoki 

43

Aplikacja prezentuj8ca zbyt du5o informacji 

43

Nierentowna aplikacja 

44

Aplikacja informacyjna 

45

Studia przypadków dla modeli aplikacji 

46

Studium przypadku: gra spo.eczno/ciowa ze znajomymi 

46

Studium przypadku: aplikacje sprzeda5y produktów 

50

Studium przypadku: aplikacje uwzglHdniaj8ce po.o5enie u5ytkownika 

53

Krótkie wskazówki na pocz8tek 

56

Nale5y zdefiniowaT docelowych odbiorców 

57

Mo5liwie wczesne budowanie punktów integracji

z serwisem spo.eczno/ciowym 

57

Budowanie z my/l8 o elementach komercyjnych 

57

Tworzenie dopracowanych, atrakcyjnych widoków 

58

 2.  Odwzorowywanie relacji u&ytkowników

na podstawie grafu powi%za' spo#eczno!ciowych ...................................................59

Graf powi8za: spo.eczno/ciowych w internecie 

59

Stosowanie grafu rzeczywistych powi8za: spo.eczno/ciowych

w wirtualnym /wiecie 

61

Automatyczne dzielenie u5ytkowników na klastry 

62

Prywatno/T i bezpiecze:stwo 

62

Budowanie zaufania 

63

UdostHpnianie prywatnych danych u5ytkownika:

model opt-in kontra model opt-out 

63

Model udostHpniania za zgod8 u5ytkownika (opt-in) 

63

Model wy.8czania udostHpniania na wniosek u5ytkownika (opt-out) 

64

Zrozumienie modelu relacji 

65

Model /ledzenia 

65

Model po.8cze: 

66

Model grupowy 

67

Relacje kontra podmioty 

71

Budowanie zwi8zków spo.eczno/ciowych — analiza grafu powi8za:

spo.eczno/ciowych Facebooka 

72

Budowanie na bazie rzeczywistych to5samo/ci 

72

Zrozumienie najskuteczniejszych kana.ów komunikacji 

73

Budowanie grup u5ytkowników 

74

Unikanie grafów nieistotnych powi8za: spo.eczno/ciowych 

74

Wskazywanie lubianych i nielubianych podmiotów za po/rednictwem

protoko.u OpenLike 

75

Integracja widgetu OpenLike 

75

Sposób prezentowania oznacze: „LubiH to” 

76

Podsumowanie 

76

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Spis tre!ci

 

7

 3.  Tworzenie podstawowych elementów

platformy aplikacji spo#eczno!ciowych ...................................................................... 79

Czego nauczysz siH w tym rozdziale? 

79

Apache Shindig 

79

Konfiguracja kontenera Shindig 

80

Instalacja kontenera Shindig w systemie Mac OS X (Leopard) 

81

Instalacja kontenera Shindig w systemie Windows 

84

Testowanie instalacji kontenera Shindig 

86

Partuza 

87

Wymagania 

88

Instalacja kontenera Partuza w systemie Mac OS X (Leopard) 

88

Instalacja kontenera Partuza w systemie Windows 

91

Testowanie instalacji kontenera Partuza 

96

Specyfikacja gad5etu OpenSocial w formacie XML 

96

Konfigurowanie aplikacji za pomoc8 wHz.a ModulePrefs 

97

Elementy Require i Optional 

98

Element Preload 

98

Element Icon 

99

Element Locale 

99

Element Link 

100

Definiowanie preferencji u5ytkownika 

101

Wyliczeniowe typy danych 

103

Tre/T aplikacji 

103

Definiowanie widoków tre/ci 

104

Tre/T wbudowana kontra tre/T zewnHtrzna 

110

Budowanie kompletnego gad5etu 

111

 4.  Definiowanie funkcji za pomoc% odwo#a' JavaScriptu

do elementów standardu OpenSocial  .......................................................................115

Czego nauczysz siH w tym rozdziale? 

115

Do.8czanie bibliotek JavaScriptu z funkcjami standardu OpenSocial 

116

Dynamiczne ustawianie wysoko/ci widoku gad5etu 

117

Umieszczanie animacji Flash w ramach gad5etu 

118

Wy/wietlanie komunikatów dla u5ytkowników 

119

Tworzenie komunikatu 

120

Okre/lanie po.o5enia okien komunikatów 

123

Definiowanie stylów komunikatów i okien 

125

Zapisywanie stanu z preferencjami u5ytkownika 

127

Programowe ustawianie tytu.u gad5etu 

129

Integracja interfejsu u5ytkownika gad5etu z podzia.em na zak.adki 

130

Podstawowy gad5et 

131

Tworzenie zak.adki na podstawie kodu jHzyka znaczników 

131

Tworzenie zak.adki w kodzie JavaScriptu 

132

Uzyskiwanie i ustawianie informacji na temat obiektu TabSet 

134

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

8

 

 Spis tre!ci

Rozszerzanie kontenera Shindig o w.asne biblioteki jHzyka JavaScript 

136

Budowanie kompletnego gad5etu 

140

Przygotowanie specyfikacji XML gad5etu 

140

Wy/wietlanie gad5etu przy u5yciu kontenera Shindig 

144

 5.  Przenoszenie aplikacji, profili i znajomych  .............................................................. 145

Czego nauczysz siH w tym rozdziale? 

145

Ocena obs.ugi standardu OpenSocial 

145

Podstawowe elementy specyfikacji OpenSocial 

147

Specyfikacja podstawowego serwera API 

148

Specyfikacja podstawowego kontenera gad5etów 

148

Specyfikacja serwera spo.eczno/ciowego interfejsu API 

149

Specyfikacja kontenera gad5etów spo.eczno/ciowych 

149

Specyfikacja kontenera OpenSocial 

150

Tworzenie rozwi8za: dla wielu kontenerów i przenoszenie aplikacji 

150

Stosowanie mieszanego /rodowiska klient-serwer 

151

Oddzielanie funkcji spo.eczno/ciowych od podstawowego kodu aplikacji 

151

Unikanie znaczników w.a/ciwych konkretnym kontenerom 

151

Przenoszenie aplikacji z Facebooka do kontenera OpenSocial 

152

Stosowanie ramek iframe dla konstrukcji niebHd8cych

aplikacjami spo.eczno/ciowymi 

152

WyodrHbnianie logiki funkcji Facebooka 

153

Oddzielenie kodu znaczników (wizualizacji) od logiki programu 

153

Stosowanie punktów ko:cowych REST zamiast jHzyka FQL 

153

Stosowanie implementacji z zasadnicz8 czH/ci8 kodu po stronie serwera 

154

Personalizacja aplikacji na podstawie danych zawartych w profilu 

154

Obiekt Person 

154

Metody wymiany danych obiektu Person 

155

Pola dostHpne w ramach obiektu Person 

160

Rozszerzanie obiektu Person 

183

Uzyskiwanie profilu u5ytkownika 

189

Promowanie aplikacji z wykorzystaniem znajomych u5ytkownika 

191

Generowanie 58da: dotycz8cych znajomych u5ytkownika 

192

Budowanie kompletnego gad5etu 

193

Specyfikacja gad5etu 

193

Kod jHzyka znaczników 

194

Kod jHzyka JavaScript 

195

Uruchamianie gad5etu 

197

 6.  Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji

i &%danie danych w kontenerze OpenSocial  ............................................................ 199

Czego nauczysz siH w tym rozdziale? 

200

Promocja aplikacji za pomoc8 strumienia aktywno/ci w kontenerze OpenSocial 

200

Personalizacja aplikacji na podstawie powiadomie: w strumieniu aktywno/ci  201
Generowanie powiadomie: w celu zwiHkszania liczby u5ytkowników 

202

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Spis tre!ci

 

9

Pasywne i bezpo/rednie publikowanie powiadomie: aplikacji 

205

Bezpo/rednie publikowanie powiadomie: aplikacji 

206

Pasywne publikowanie powiadomie: aplikacji 

207

Zrównowa5one publikowanie powiadomie: 

209

Generowanie 58da: AJAX i 58da: dostHpu do danych zewnHtrznych 

210

Generowanie standardowych 58da: dostHpu do danych 

211

Umieszczanie tre/ci w 58daniach danych 

212

U5ywanie autoryzowanych 58da: do zabezpieczania po.8cze: 

213

Budowanie kompletnego gad5etu 

221

 7.  Zaawansowane techniki OpenSocial i przysz#o!( tego standardu  .........................225

Czego nauczysz siH w tym rozdziale? 

225

Potokowe przesy.anie danych 

225

Rodzaje 58da: danych 

228

UdostHpnianie danych dla 58da: zewnHtrznych 

233

Korzystanie z potokowego przesy.ania danych po stronie klienta 

234

Obs.uga b.Hdów generowanych przez potok danych 

237

Parametry dynamiczne 

238

Szablony OpenSocial 

240

Alternatywny model kodu jHzyka znaczników i danych 

241

Wy/wietlanie szablonów 

243

Wyra5enia 

247

Zmienne specjalne 

248

Wyra5enia warunkowe 

250

Przetwarzanie tre/ci w pHtli 

253

j8czenie potokowego przesy.ania danych i szablonów 

258

Pozosta.e znaczniki specjalne 

260

Biblioteki szablonów 

262

Interfejs API jHzyka JavaScript 

265

Kilka dodatkowych znaczników — jHzyk znaczników OpenSocial 

270

Wy/wietlanie nazwiska u5ytkownika — znacznik os:Name 

271

Lista wyboru u5ytkownika — znacznik os:PeopleSelector 

271

Wy/wietlanie odznaki u5ytkownika — znacznik os:Badge 

272

jadowanie zewnHtrznego kodu HTML — znacznik os:Get 

272

Obs.uga lokalizacji za pomoc8 pakietów komunikatów 

272

Biblioteki API protoko.u OpenSocial REST 

275

DostHpne biblioteki 

275

Przysz.o/T standardu OpenSocial: obszary rozwoju 

276

Kontenery korporacyjne 

276

Mobilna rewolucja 

277

Rozproszone frameworki internetowe 

277

Standard OpenSocial i rozproszone frameworki internetowe 

277

Standard Activity Streams 

278

Protokó. PubSubHubbub 

278

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

10

 

 Spis tre!ci

Protokó. Salmon 

279

Protokó. Open Graph 

280

Budowanie kompletnego gad5etu 

281

 8.  Zagadnienia zwi%zane z bezpiecze'stwem aplikacji spo#eczno!ciowych .............287

Czego nauczysz siH w tym rozdziale? 

287

Wykonywanie zewnHtrznego kodu za po/rednictwem ramek iframe 

288

Bezpieczny model — projekt Caja 

288

Dlaczego warto u5ywaT kompilatora Caja? 

289

Rodzaje ataków — jak Caja chroni u5ytkownika? 

289

Przekierowywanie u5ytkowników bez ich zgody 

290

lledzenie historii przegl8darki u5ytkownika 

290

Wykonywanie dowolnego kodu za pomoc8 funkcji document.createElement 

291

Rejestrowanie klawiszy naciskanych przez u5ytkownika 

291

Konfiguracja kompilatora Caja 

293

Przetwarzanie skryptów za pomoc8 kompilatora Caja z poziomu wiersza polece:  295

Zabezpieczanie kodu HTML-a i JavaScriptu 

295

Zmiana docelowego formatu kodu 

300

Uruchamianie kompilatora Caja z poziomu aplikacji internetowej 

301

Stosowanie kompilatora Caja dla gad5etu OpenSocial 

303

Dodawanie kompilatora Caja do gad5etu 

303

Praktyczny przyk.ad 

304

Wczesne wykrywanie niebezpiecznych elementów JavaScriptu

za pomoc8 narzHdzia JSLint 

305

Eksperymenty w /rodowisku Caja Playground 

306

Wskazówki dotycz8ce pracy w /rodowisku Caja 

306

Implementacja modu.owego kodu — kompilatora Caja nie nale5y stosowaT

dla ca.ego projektu 

307

Stosowanie wstHpnie przetworzonych bibliotek JavaScriptu 

308

Nie nale5y u5ywaT Firebuga dla przetworzonego kodu Mród.owego

JavaScriptu 

309

Nie nale5y umieszczaT zdarze: w kodzie jHzyka znaczników 

309

Centralizacja kodu JavaScriptu — stosowanie wy.8cznie 58da: danych

i kodu jHzyka znaczników 

311

L5ejsza alternatywa dla kompilatora Caja: narzHdzie ADsafe 

312

ADsafe kontra Caja — którego narzHdzia u5ywaT? 

313

Jak zaimplementowaT /rodowisko ADsafe? 

314

Konfiguracja obiektu /rodowiska ADsafe 

314

Obiekt DOM 

315

Wybór konkretnych wHz.ów DOM za pomoc8 zapyta: 

317

Praca z obiektami pakietów 

321

Do.8czanie zdarze: 

327

Definiowanie bibliotek 

328

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Spis tre!ci

 

11

Budowanie kompletnego gad5etu 

329

nród.o danych 

330

Sekcja nag.ówkowa: do.8czane skrypty i style 

330

Cia.o: warstwa jHzyka znaczników 

332

Cia.o: warstwa jHzyka JavaScript 

332

Ostateczny wynik 

334

Podsumowanie 

335

 9.  Zabezpieczanie dost$pu do grafu powi%za' spo#eczno!ciowych

za pomoc% standardu OAuth  .................................................................................... 337

Punkt wyj/cia — uwierzytelnianie podstawowe 

337

Implementacja uwierzytelniania podstawowego — jak to dzia.a? 

338

Wady stosowania uwierzytelniania podstawowego 

339

Standard OAuth 1.0a 

340

Przep.yw pracy w standardzie OAuth 1.0a 

341

Standard OAuth z perspektywy u5ytkownika ko:cowego 

348

Dwuetapowa autoryzacja OAuth kontra trzyetapowa autoryzacja OAuth 

350

Przyk.ad implementacji trzyetapowej autoryzacji OAuth 

354

NarzHdzia i wskazówki zwi8zane z diagnozowaniem problemów 

369

OAuth 2 

373

Przep.yw pracy w standardzie OAuth 2 

373

Przyk.ad implementacji: Facebook 

381

Przyk.ad implementacji: 58danie dodatkowych informacji na temat

u5ytkownika w procesie autoryzacji OAuth w serwisie Facebook 

392

Przyk.ad implementacji: aplikacja z perspektywy u5ytkownika ko:cowego 

394

Wskazówki dotycz8ce diagnozowania problemów z 58daniami 

396

Podsumowanie 

400

 10.  Przysz#o!( serwisów spo#eczno!ciowych:

definiowanie obiektów spo#eczno!ciowych
za po!rednictwem rozproszonych frameworków sieciowych ................................ 401

Czego nauczysz siH w tym rozdziale? 

401

Protokó. Open Graph — definiowanie stron internetowych

jako obiektów spo.eczno/ciowych 

402

Wzloty i upadki metadanych 

403

Dzia.anie protoko.u Open Graph 

403

Implementacja protoko.u Open Graph 

404

Rzeczywisty przyk.ad: implementacja protoko.u Open Graph

w serwisie Facebook 

410

Praktyczna implementacja: odczytywanie danych protoko.u Open Graph

ze Mród.a w internecie 

413

Wady protoko.u Open Graph 

419

Strumienie aktywno/ci: standaryzacja aktywno/ci spo.eczno/ciowych 

420

Dlaczego warto zdefiniowaT standard dla aktywno/ci? 

421

Implementacja standardu Activity Streams 

421

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

12

 

 Spis tre!ci

Typy obiektów 

424

Czasowniki 

426

WebFinger — rozszerzanie grafu powi8za: spo.eczno/ciowych na podstawie

adresów poczty elektronicznej 

429

Od finger do WebFinger: geneza protoko.u WebFinger 

429

Implementacja protoko.u WebFinger 

430

Wady protoko.u WebFinger 

432

Protokó. OExchange — budowanie grafu udostHpniania tre/ci spo.eczno/ciowych 

433

Jak dzia.a protokó. OExchange? 

433

Zastosowania protoko.u OExchange 

434

Implementacja protoko.u OExchange 

435

Protokó. PubSubHubbub: rozpowszechnianie tre/ci 

440

Jak dzia.a protokó. PubSubHubbub? 

441

Zalety z perspektywy wydawców i subskrybentów 

443

Serwery hubów i us.ugi implementacji 

445

Biblioteki przep.ywu pracy 

445

Budowanie wydawcy w jHzyku PHP 

446

Budowanie wydawcy w jHzyku Python 

448

Budowanie subskrybenta w jHzyku PHP 

450

Budowanie subskrybenta w jHzyku Python 

452

Protokó. Salmon: ujednolicenie stron konwersacji 

455

Dzia.anie protoko.u Salmon 

455

Budowanie rozwi8za: na bazie protoko.u PubSubHubbub 

457

Ochrona przed nadu5yciami i spamem 

458

Przegl8d implementacji 

459

Podsumowanie 

460

 11.  Rozszerzanie grafu powi%za' spo#eczno!ciowych

za pomoc% standardu OpenID ................................................................................... 461

Standard OpenID 

461

Klucz do sukcesu — decentralizacja 

462

Udoskonalenia wzglHdem tradycyjnego logowania 

462

DostHp do istniej8cej bazy danych u5ytkowników

i grafu powi8za: spo.eczno/ciowych 

462

Czy ju5 teraz dysponujH implementacj8 standardu OpenID?

Gdzie mam jej szukaT? 

463

Procedura uwierzytelniania OpenID 

464

Krok 1.: 58danie logowania przy u5yciu identyfikatora OpenID 

464

Krok 2.: operacja odkrywania w celu wyznaczenia adresu URL

punktu ko:cowego 

465

Krok 3.: 58danie uwierzytelnienia u5ytkownika 

466

Krok 4.: udostHpnienie stanu sukcesu lub niepowodzenia 

467

Dostawcy OpenID 

469

Omijanie problemów odkrywania domen w standardzie OpenID 

469

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Spis tre!ci

 

13

Rozszerzenia standardu OpenID 

471

Rozszerzenie Simple Registration 

472

Rozszerzenie Attribute Exchange 

473

Rozszerzenie Provider Authentication Policy Extension 

479

Aktualnie tworzone rozszerzenia 

483

Przyk.ad implementacji: OpenID 

484

Implementacja standardu OpenID w jHzyku PHP 

485

Implementacja standardu OpenID w jHzyku Python 

497

Typowe b.Hdy i techniki diagnostyczne 

508

Niezgodno/T adresu URL wywo.a: zwrotnych 

509

Brak mo5liwo/ci odkrycia identyfikatora OpenID 

509

Podsumowanie 

510

 12.  Uwierzytelnianie hybrydowe

— wygoda u&ytkownika i pe#en dost$p do profilu  ..................................................511

Rozszerzenie hybrydy standardów OpenID i OAuth 

511

Istniej8ce implementacje 

512

Kiedy nale5y u5ywaT standardu OpenID, a kiedy jego hybrydy

ze standardem OAuth? 

512

Pytania, na które warto sobie odpowiedzieT

przed wybraniem w.a/ciwego rozwi8zania 

512

Zalety i wady: standardowa implementacja OpenID 

513

Zalety i wady: uwierzytelnianie hybrydowe 

514

Przebieg uwierzytelniania w modelu hybrydowym

na bazie standardów OpenID i OAuth 

515

Kroki 1. i 2.: odkrywanie (pierwsze dwa kroki procedury OpenID) 

516

Krok 3.: akceptacja uprawnie: przez u5ytkownika 

516

Krok 4.: przekazanie stanu akceptacji/odrzucenia 58dania OpenID

i parametrów rozszerzenia hybrydowego 

517

Krok 5.: wymiana wstHpnie zaakceptowanego tokenu 58dania

na token dostHpu 

519

Krok 6.: generowanie podpisanych 58da: dostHpu do chronionych

danych u5ytkownika 

520

Przyk.ad implementacji: OpenID, OAuth i Yahoo! 

521

Konfiguracja aplikacji: uzyskanie kluczy standardu OAuth na potrzeby

procesu uwierzytelniania hybrydowego 

521

Implementacja uwierzytelniania hybrydowego w jHzyku PHP 

522

Implementacja uwierzytelniania hybrydowego w jHzyku Python 

533

Podsumowanie 

546

Dodatek A Podstawowe zagadnienia zwi%zane z budow% aplikacji internetowych .......547

Dodatek B S#ownik poj$(  .....................................................................................................563

Skorowidz  .................................................................................................................. 567

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

14

 

 Spis tre!ci

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

199

ROZDZIA* 6.

Aktywno!( u&ytkowników,

publikowanie powiadomie' aplikacji

i &%danie danych

w kontenerze OpenSocial

Do  najwiHkszych  wyzwa:  stoj8cych  przed  programistami  buduj8cymi  aplikacje  spo.eczno-
/ciowe nale5y w.a/ciwa promocja tych aplikacji i efektywne korzystanie z zewnHtrznych Mró-
de. danych. Prawid.owe stosowanie zewnHtrznych Mróde. danych jest warunkiem utworzenia
bogatego zbioru funkcji, które przyci8gn8 uwagH u5ytkowników i pozwol8 zbudowaT bazH
lojalnych klientów.

Wielu programistów traktuje kwestie publikowania komunikatów aplikacji i analizy aktywno-
/ci jako nieistotny szczegó. — uwa5aj8 oni, 5e architektura, która ma na celu zwiHkszanie bazy
aktywnych u5ytkowników, nie ma wiHkszego znaczenia. Okazuje siH jednak, 5e standardowe
metody promocji aplikacji oferowane przez kontenery, czyli na przyk.ad galerie, nie stanowi8
efektywnych form zachHcania u5ytkowników do instalowania kolejnych rozwi8za:. W wielu
przypadkach galerie s8 przepe.nione i nieczytelne — nierzadko obejmuj8 tysi8ce aplikacji
uporz8dkowanych w taki sposób, aby na najcenniejszych, najwy5szych pozycjach znajdowa.y
siH najbardziej popularne produkty. Z perspektywy nowego programisty taki kszta.t galerii
oznacza nie tylko konieczno/T konkurowania z wieloma aplikacjami, ale te5 wizjH startu z naj-
mniej atrakcyjnej pozycji. Sytuacja przypomina trochH problem historii kredytowej — brak
kredytów jest czHsto traktowany na równi z nieterminowo sp.acanymi kredytami.

Warto wiHc rozwa5yT promocjH aplikacji z wykorzystaniem aktywno/ci samych u5ytkowni-
ków, przy zastosowaniu przemy/lanego modelu udostHpniania informacji o produktach. Takie
rozwi8zanie umo5liwia przekazywanie linków do aplikacji bezpo/rednio w strumieniu codzien-
nej aktywno/ci u5ytkownika. Innym czynnikiem u.atwiaj8cym przyci8ganie uwagi u5ytkow-
ników jest regularnie od/wie5ana, atrakcyjna tre/T aplikacji (uzyskiwana  za po/rednictwem
58da: danych). W ten sposób mo5na nie tylko podnie/T liczbH u5ytkowników instaluj8cych
aplikacjH, ale tak5e zwiHkszyT ich aktywno/T.

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

200

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

Czego nauczysz si$ w tym rozdziale?

W rozdziale 5. omówili/my metody personalizacji i dostosowywania aplikacji na podstawie
informacji zawartych w profilu u5ytkownika oraz techniki promocji z wykorzystaniem listy
znajomych u5ytkownika. W tym rozdziale wspomniane zagadnienia zostan8 dodatkowo roz-
winiHte — skoncentrujemy siH na reprezentacji aktywno/ci u5ytkowników w kontenerze Open-
Social i na technikach tworzenia aplikacji oferuj8cych szerokie mo5liwo/ci konfiguracji i dosto-
sowywania (dziHki bogatym Mród.om danych budowanym przy u5yciu 58da: do Mróde.
zewnHtrznych). W tym rozdziale zostan8 omówione nastHpuj8ce zagadnienia:

personalizacja  stanu  aplikacji  pod  k8tem  u5ytkownika  na  podstawie  jego  aktywno/ci
spo.eczno/ciowej;

poszerzanie bazy u5ytkowników poprzez generowanie czynno/ci;

wyja/nienie modeli pasywnego i bezpo/redniego publikowania powiadomie: aplikacji;

generowanie 58da: danych niezbHdnych do budowy bogatych Mróde. danych i zwiHksza-
nia liczby aktywnych u5ytkowników;

tworzenie uwierzytelnionych (podpisanych) 58da: danych dla zapewnienia bezpiecze:stwa
(poprzez weryfikacjH danych uwierzytelniaj8cych i Mróde. danych).

Po opanowaniu wymienionych zagadnie: i technik bHdzie mo5na przyst8piT do budowy apli-
kacji spo.eczno/ciowych dobrze przygotowanych do promocji w/ród u5ytkowników.

Promocja aplikacji za pomoc% strumienia aktywno!ci
w kontenerze OpenSocial

Jednym z najskuteczniejszych narzHdzi w rHkach programistów aplikacji spo.eczno/ciowych
jest mo5liwo/T wysy.ania powiadomie: (aktualizacji) do strumienia aktywno%ci u5ytkownika.
Strumie:  aktywno/ci  (patrz  rysunek  6.1)  jest  centralnym  obszarem  powiadomie:  kierowa-
nych  do  u5ytkownika  aplikacji  i  jego  znajomych.  Strumie:  aktywno/ci  stanowi  te5  g.ówny
kana. komunikacji z u5ytkownikami kontenera. Za po/rednictwem tego medium mo5na pro-
mowaT aplikacjH poprzez rozsy.anie zachHt trafiaj8cych do jak najwiHkszej liczby u5ytkowników.
Oznacza  to,  5e  strumie:  aktywno/ci  umo5liwia  nieporównanie  skuteczniejsze  zwiHkszanie
liczby u5ytkowników aplikacji ni5 zwyk.a galeria aplikacji.

Rysunek 6.1. Strumie& aktywno(ci OpenSocial obejmuj+cy obrazy i komentarze

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Promocja aplikacji za pomoc% strumienia aktywno!ci w kontenerze OpenSocial

 

201

W przypadku wiHkszo/ci kontenerów aplikacji spo.eczno/ciowych elementy strumienia aktyw-
no/ci obejmuj8 nastHpuj8ce dane:

tytu. opisuj8cy czynno/T u5ytkownika;

link do Mród.a aktualizacji (powiadomienia), na przyk.ad do samej aplikacji;

opis obejmuj8cy dodatkowe informacje na temat danej aktualizacji lub zachHta do dzia.ania
(na przyk.ad do zainstalowania aplikacji przez pozosta.ych u5ytkowników);

opcjonalne elementy multimedialne, jak animacja czy obraz, które mog8 dodatkowo przy-
ci8gn8T uwagH u5ytkowników;

komentarze lub oznaczenia „lubiH to” od znajomych u5ytkownika.

Tylko dobre zrozumienie sk.adników strumienia aktywno/ci umo5liwi programi/cie pe.ne
wykorzystanie  potencja.u  tego  strumienia.  Standard  OpenSocial  udostHpnia  dwa  narzHdzia
do operowania na powiadomieniach w strumieniu aktywno/ci — pierwsze z nich umo5liwia
programistom wykorzystywanie istniej8cych elementów strumienia do personalizacji aplikacji,
drugie umo5liwia generowanie nowych elementów strumienia w celu przyci8gania nowych
u5ytkowników lub zwiHkszania zaanga5owania dotychczasowych.

Personalizacja aplikacji na podstawie powiadomie'
w strumieniu aktywno!ci

Je/li profil obejmuje dane wybrane przez samego u5ytkownika, które w dodatku odzwiercie-
dlaj8  sposób  postrzegania  u5ytkownika  przez  niego  samego,  strumie:  aktywno/ci  dobrze
ilustruje to, co robi i co lubi ten u5ytkownik. Strumie: aktywno/ci obejmuje takie informacje jak
wykaz instalowanych aplikacji, lista aktualizacji (powiadomie:) tych aplikacji oraz informacje
o statusie i profilu. Strumie: aktywno/ci jest te5 bezcennym Mród.em dodatkowych danych,
które pozwalaj8 lepiej oceniT internetowe zwyczaje, preferencje i uprzedzenia u5ytkownika.
Strumie:  aktywno/ci  stosowany  .8cznie  z  informacjami  zawartymi  w  profilu  u5ytkownika
stanowi dla programisty wprost doskona.8 okazjH do przygotowania tre/ci i reklam pod k8tem
konkretnego u5ytkownika.

Strumie: aktywno/ci u5ytkownika jest jednym z najcenniejszych Mróde. informacji w ka5dym
serwisie  spo.eczno/ciowym.  Za  po/rednictwem  tego  strumienia  programista  ma  dostHp  do
takich informacji jak to, kiedy u5ytkownik wysy.a wiadomo/ci, z kim siH kontaktuje, co robi
i z jakich aplikacji korzysta.

Specyfikacja OpenSocial definiuje standardowe metody uzyskiwania tych szczegó.owych danych:

// uzyskuje dane o aktywno(ci bie-+cego u-ytkownika
osapi.activities.get({userId: '@viewer ', count: 20}).execute(function(result){
   if (!result.error){
      var activities = result.list;
      var html = ' ';

      // buduje tytu/ i adres URL dla ka-dej odkrytej czynno(ci
      for (var i = 0; i < activities.length; i++){
         html += 'Tytu@ czynnoAci: ' + activities[i].title +
                 'Adres URL czynnoAci: ' + activities[i].url;
      }
   }
});

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

202

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

W  ramach  tego  58dania  wywo.ano  metodH 

osapi.activities.get(...)

,  aby  zasygnalizowaT

potrzebH  pobrania  strumienia  aktywno/ci  u5ytkownika.  Obiekt  JSON,  który  przekazano  za
po/rednictwem parametru tej metody, reprezentuje identyfikator u5ytkownika (wskazuj8cy
u5ytkownika aktualnie korzystaj8cego z aplikacji) oraz liczbH oczekiwanych czynno/ci (w tym
przypadku równ8 20).

Po zwróceniu odpowiedzi dla tego 58dania mo5na przyst8piT do analizy i dowolnego wyko-
rzystywania poszczególnych czynno/ci.

Generowanie powiadomie'
w celu zwi$kszania liczby u&ytkowników

Wiele kontenerów aplikacji spo.eczno/ciowych udostHpnia przepe.nione, nieczytelne galerie,
w których nowe aplikacje s8 spychane na najmniej atrakcyjne pozycje. W ten sposób twórcy
kontenerów zapobiegaj8 przes.anianiu podstawowych funkcji spo.eczno/ciowych przez okna
dodatkowych aplikacji. Taki kszta.t typowych galerii stanowi powa5ny problem dla progra-
mistów aplikacji — skoro budowane aplikacje trafiaj8 do podzak.adek lub innych trudno dostHp-
nych miejsc w ramach kontenera, jak mo5na dotrzeT do nowych u5ytkowników?

Jedn8 z najlepszych metod zachHcania u5ytkowników do instalowania aplikacji jest promocja
produktu  za  po/rednictwem  strumieni  aktywno/ci  u5ytkowników.  Strumie:  aktywno/ci  to
jedna z niewielu dróg docierania do u5ytkowników (je/li oczywi/cie sam kontener nie udostHpnia
atrakcyjnych  miejsc  dla  okien  aplikacji).  WiHkszo/T  programistów,  którzy  zdecydowali  siH
umie/ciT w strumieniu aktywno/ci nowe, odpowiednio atrakcyjne i  przyci8gaj8ce  uwagH
powiadomienia,  obserwowa.a  nieporównanie  wiHkszy  wzrost  zainteresowania  swoimi  produk-
tami ni5 po umieszczeniu tych samych aplikacji w galerii.

Okazuje siH, 5e specyfikacja OpenSocial definiuje prost8 metodH jHzyka JavaScript obs.ugu-
j8c8 umieszczanie nowych czynno/ci w strumieniu aktywno/ci. Za pomoc8 tej metody pro-
gramista mo5e promowaT swoj8 aplikacjH, kieruj8c do u5ytkowników specjalnie przygotowane
komunikaty.

Umieszczanie komunikatu w strumieniu aktywno!ci u&ytkownika

W kontenerze zgodnym ze standardem OpenSocial 0.9 do umieszczania aktualizacji (powia-
domie:)  w  strumieniu  aktywno/ci  u5ytkownika  s.u5y  metoda 

osapi.activities.create(...)

.

Metoda  umo5liwia  programi/cie  .atwe  wysy.anie  komunikatów  z  aplikacji  do  strumienia
aktywno/ci lub dowolnego innego kana.u przekazywania powiadomie:, który jest obs.ugiwany
przez dany kontener.

Metoda 

osapi.activities.create(...)

  otrzymuje  na  wej/ciu  jeden  parametr  —  obiekt  JSON

zawieraj8cy parametry 58dania dotycz8cego elementów strumienia aktywno/ci (patrz tabela 6.1).

Za pomoc8 parametrów opisanych w tabeli 6.1 mo5na zbudowaT blok jHzyka JavaScript umiesz-
czaj8cy now8 aktualizacjH w strumieniu aktywno/ci u5ytkownika:

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Promocja aplikacji za pomoc% strumienia aktywno!ci w kontenerze OpenSocial

 

203

Tabela 6.1. Parametry -+dania elementu strumienia aktywno(ci obs/ugiwane przez metod5 osapi.activities.create

Parametr

Opis

activity

Obiekt 

Activity

 standardu OpenSocial definiuj$cy tre%& wysy'anego powiadomienia.

auth

Obiekt 

AuthToken

 definiuj$cy rodzaj autoryzacji (na przyk'ad 

HttpRequest.Authorization

).

appId

*a+cuch identyfikatora wskazuj$cy aplikacj,, która wys'a'a dane powiadomienie (aktualizacj,). Kontener mo0e u0y&
tego identyfikatora do automatycznego wy%wietlenia w ramach powiadomienia szczegó'owych informacji o aplikacji
i linków prowadz$cych na jej stron,.

groupId

Identyfikator grupy, do której nale0y wys'a& nowe powiadomienie (na przyk'ad 

@self

).

userId

Identyfikator u0ytkownika, do którego ma zosta& przypisana tworzona aktualizacja (na przyk'ad 

@me

@viewer

lub 

@owner

). Ten parametr mo0e mie& posta& 'a+cucha lub tablicy 'a+cuchów.

// umieszcza nowe powiadomienie w strumieniu aktywno(ci bie-+cego u-ytkownika
osapi.activities.create({
   userId: "@viewer",
   groupId: "@self",
   activity: {
      title: "Moja aplikacja robi mnóstwo przydatnych rzeczy",
      body: "<a href='http://www.mysite.com'>Kliknij tutaj</a>, aby uzyskaQ wiRcej informacji",
      url: "http://www.mysite.com/"
   }
}).execute();

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

Aby wygenerowaT powiadomienie (aktualizacjH), w powy5szym kodzie wywo.ano metodH

osapi.activities.create(...)

  i  przekazano  na  jej  wej/ciu  odpowiednio  przygotowany  obiekt

JSON. W ramach tego obiektu nale5y wskazaT strumie: aktywno/ci, do którego ma trafiT
nowa aktualizacja  (w tym  przypadku  bHdzie  to  strumie:  bie58cego  u5ytkownika  aplikacji),
grupH docelow8 (tutaj 

self

) oraz obiekt 

activity

 reprezentuj8cy tre/T powiadomienia. W powy5-

szym kodzie obiekt 

activity

 zawiera tytu., adres URL wskazywany przez link w tytule oraz

opis  (cia.o)  aktualizacji.  Cia.o  aktualizacji  mo5e  obejmowaT  niewielki  podzbiór  znaczników
jHzyka HTML, w tym 

<b>

<i>

<a>

 oraz 

<span>

. Wykonanie tego kodu spowoduje umieszczenie

nowej aktualizacji w strumieniu aktywno/ci wskazanego u5ytkownika.

Ustawianie priorytetu aktualizacji

Podczas umieszczania w strumieniu aktywno/ci powiadomienia dla u5ytkownika nale5y zagwa-
rantowaT mo5liwo/T wysy.ania powiadomie: aplikacji w imieniu samego u5ytkownika, nawet
je/li ten u5ytkownik wprost nie przekaza. aplikacji odpowiednich uprawnie:. Takie dzia.anie
jest mo5liwe dziHki priorytetom czynno/ci.

Aby ustawiT priorytet powiadomienia, nale5y ustawiT opcjonaln8 flagH 

priority

. To pole logiczne

mo5e zawieraT albo warto/T 

0

 (niski priorytet), albo warto/T 

1

 (wysoki priorytet). Stosowana

warto/T powinna zale5eT od tego, czy u5ytkownik bHd8cy adresatem powiadomienia nada. apli-
kacji odpowiednie uprawnienia. Innym wa5nym czynnikiem jest implementacja samego kon-
tenera. Je/li programista zdefiniowa. wysoki priorytet (

1

) i je/li u5ytkownik nie da. aplikacji

uprawnie: do umieszczania aktualizacji w jego imieniu, aplikacja podejmie próbH za.adowa-
nia mechanizmu uwierzytelniania, aby zapytaT u5ytkownika o zgodH na umieszczenie nowego

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

204  

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

elementu w strumieniu aktywno/ci. Je/li programista ustawi. niski priorytet (0) i je/li u5ytkow-
nik nie da. aplikacji niezbHdnych uprawnie:, aktualizacja zostanie zignorowana, a u5ytkownik
nie zostanie zapytany o zgodH na umieszczenie nowej aktualizacji w strumieniu aktywno/ci.

Ustawienie flagi 

priority

 wymaga umieszczenia odpowiedniej warto/ci w obiekcie JSON prze-

kazywanym podczas tworzenia 58dania:

// umieszcza nowe powiadomienie z wysokim priorytetem w strumieniu aktywno(ci bie-+cego u-ytkownika
osapi.activities.create({
   userId: "@viewer",
   activity: {
      title: "WiRcej informacji moUna znaleVQ na moim blogu",
      url: "http://www.nakedtechnologist.com/",
      priority: 1
   }
}).execute();

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

W powy5szym przyk.adzie u5ytkownik, który nie nada. aplikacji uprawnie: do umieszcza-
nia powiadomie: w swoim strumieniu aktywno/ci, jest proszony o zgodH na dodanie nowej
aktualizacji. Pytanie o zgodH mo5e byT wy/wietlone, je/li na przyk.ad u5ytkownik nie zezwoli.
danej aplikacji na dostHp do swoich danych spo.eczno/ciowych lub je/li przegl8da tH aplikacjH
w trybie podgl8du.

Wzbogacanie aktualizacji o tre!ci multimedialne

Do.8czanie elementów multimedialnych do powiadomie: umo5liwia wzbogacenie interakcji
z tre/ci8 umieszczan8 w strumieniu aktywno/ci i du5o skuteczniejsze przyci8ganie uwagi
u5ytkownika ni5 w przypadku standardowego tekstu i linków. Stosowanie elementów multi-
medialnych jest wiHc /wietnym sposobem zwiHkszania liczby odbiorców, którzy zdecyduj8 siH
na bli5sze poznanie i zainstalowanie promowanej aplikacji.

w8danie wys.ania powiadomienia obejmuje opcjonalne pole 

mediaItems

, w którym programista

mo5e umieszczaT obrazy, pliki audio i zapisy wideo wzbogacaj8ce tre/T aktualizacji.

Do  tworzenia  elementów  multimedialnych  w  ramach  kontenera  OpenSocial  s.u5y  metoda

opensocial.newMediaItem(...)

, która otrzymuje na wej/ciu typ MIME definiuj8cy rodzaj dodawa-

nej tre/ci oraz adres URL samej tre/ci, na przyk.ad obrazu:

// tworzy nowy element multimedialny dla obrazu
var imageUrl = "http://www.mysite.com/image.jpg";
var mediaImg = opensocial.newMediaItem("image/jpeg", imageUrl);
var mediaObj = [mediaImg];

// buduje list5 parametrów dla nowego powiadomienia
var params = {};
params[opensocial.Activity.Field.TITLE] = "Wys@anie obrazu";
params[opensocial.Activity.Field.URL] = "http://www.myserver.com/index.php";
params[opensocial.Activity.Field.BODY] = "Test: <b>1, 2, 3</b>";
params[opensocial.Activity.Field.MEDIA_ITEMS] = mediaObj;
var activityObj = opensocial.newActivity(params);

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Pasywne i bezpo!rednie publikowanie powiadomie' aplikacji

 

205

// generuje -+danie utworzenia nowego powiadomienia
osapi.activities.create({
   userId: "@viewer",
   activity: activityObj
}).execute();

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

Proces do.8czania obiektu reprezentuj8cego tre/T multimedialn8 w powy5szym przyk.adzie
sk.ada siH z trzech kroków. W pierwszym kroku nale5y utworzyT nowy obiekt elementu
multimedialnego za pomoc8 metody 

opensocial.newMediaItem(...)

, która tworzy odpowiedni8

strukturH. Pierwszy parametr tej metody, w tym przypadku 

image/jpeg

, reprezentuje typ MIME,

czyli rodzaj tworzonych danych. Drugi parametr zawiera .a:cuch adresu URL wskazuj8cego
odpowiedni obraz. W powy5szym przyk.adzie zastosowano typowe rozwi8zanie dla do.8cza-
nia tre/ci multimedialnych do powiadomienia, czyli utworzono tablicH obejmuj8c8 poszczególne
pola nowego obiektu.

W drugim kroku nale5y utworzyT obiekt 

activity

 obejmuj8cy wszystkie dane sk.adowe, w tym

obiekt tre/ci multimedialnych. Parametry sk.adaj8ce siH na ten obiekt mo5na zdefiniowaT
w formie obiektu JSON lub za pomoc8 metody 

opensocial.newActivity(...)

, która generuje

odpowiedni8  strukturH.  W  roli  podstawowych  danych  tekstowych  obiektu  powiadomienia
u5yto tytu.u, cia.a i adresu URL. W powy5szym kodzie dodano te5 element multimedialny
za po/rednictwem pola 

opensocial.Activity.Field.MEDIA_ITEMS

, któremu przypisano tablicH zawie-

raj8c8 obiekt multimedialny utworzony w poprzednim kroku. Prezentowany kod wywo.uje
nastHpnie  metodH 

opensocial.newActivity(...)

,  aby  wygenerowaT  strukturH  nowego  powia-

domienia.

W ostatnim kroku nale5y przygotowaT 58danie utworzenia powiadomienia. Na wej/ciu metody

create

 przekazano identyfikator  u5ytkownika, do którego ma  trafiT  powiadomienie  (w  tym

przypadku bHdzie to bie58cy u5ytkownik aplikacji), oraz utworzony wcze/niej obiekt samego
powiadomienia.

Wymienione kroki wystarcz8 do wys.ania powiadomienia (aktualizacji) obejmuj8cego obraz.
Wstawienie zapisu wideo lub strumienia audio wymaga przeprowadzenia identycznej pro-
cedury — nale5y tylko pamiHtaT o ustawieniu w.a/ciwego adresu URL i typu MIME dla pre-
zentowanych danych.

Pasywne i bezpo!rednie
publikowanie powiadomie' aplikacji

Istniej8 dwie g.ówne kategorie metod promowania aplikacji spo.eczno/ciowych: bezpo%red-
nie

 i pasywne publikowanie powiadomie+. Wybór w.a/ciwego rozwi8zania zale5y od okolicz-

no/ci, w jakich aktualizacja bHdzie publikowana w imieniu u5ytkownika, oraz od tego, czy
u5ytkownik ma /wiadomo/T generowania tej aktualizacji.

Istnieje kilka alternatywnych modeli publikowania powiadomie: aplikacji. Jak ju5 wspomnia-
.em, wielu programistów promuje swoje aplikacje, umieszczaj8c powiadomienia w strumieniach

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

206

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

aktywno/ci  u5ytkownika,  tak  aby  odpowiednie  komunikaty  by.y  prezentowane  wszystkim
znajomym tego u5ytkownika. Programi/ci stosuj8cy tH metodH s8 przekonani, 5e wiHcej powia-
domie: oznacza wiHksz8 widoczno/T oferty. Przyjmijmy, 5e u5ytkownik ma zainstalowanych
co najmniej piHT aplikacji, a ka5da z nich wysy.a maksymaln8 mo5liw8 liczbH powiadomie:,
które w dodatku s8 rozsy.ane do wszystkich znajomych tego u5ytkownika. Co bHdzie, je/li
kontener oferuje mechanizm ukrywania wszystkich tego rodzaju powiadomie:, aby zapobiec
zasypywaniu  swojego  strumienia  aktywno/ci  natrHtnymi  ofertami?  Okazuje  siH,  5e  niemal
wszystkie kontenery obs.uguj8ce aplikacje spo.eczno/ciowe umo-liwiaj+ ukrywanie tego rodzaju
powiadomie:, zatem programi/ci musz8 bardzo ostro5nie planowaT dobór wiadomo/ci i czH-
stotliwo/T  ich  wysy.ania.  W  takim  przypadku  nale5y  rozwa5yT  wybór  bezpo/redniego  lub
pasywnego publikowania powiadomie:. Obie opcje maj8 swoje zalety i wady, które zostan8
szczegó.owo omówione w poni5szych punktach.

Bezpo!rednie publikowanie powiadomie' aplikacji

Bezpo/rednie publikowanie powiadomie: aplikacji polega na umieszczaniu w strumieniu
aktywno/ci komunikatów (aktualizacji) zale5nie od czynno/ci podejmowanych przez u5ytkow-
nika, za jego wiedz8 i zgod8. U5ytkownik godzi siH na ten model, akceptuj8c odpowiedni8
opcjH, korzystaj8c z funkcji oferowanych przez tH aplikacjH lub wybieraj8c jak8/ formH nagrody
lub wsparcia w ramach tej aplikacji.

Podstawowym  argumentem  na  rzecz  mechanizmu  bezpo/redniego  publikowania  powiado-
mie: jest to, 5e u5ytkownik wie o dzia.aniach podejmowanych przez aplikacjH w jego imie-
niu i — tym samym — mniejsze jest prawdopodobie:stwo wy.8czenia (ukrycia) powiado-
mie:  wysy.anych  przez  aplikacjH  (w  konfiguracji  kontenera  lub  samej  aplikacji)  lub  wrHcz
odinstalowania aplikacji z powodu utraty zaufania do jej dzia.a:. Utrzymanie relacji zaufania
pomiHdzy u5ytkownikiem a aplikacj8 jest bardzo wa5ne, je/li wokó. tej aplikacji ma byT budo-
wana szersza spo.eczno/T. Programista powinien robiT wszystko, aby u5ytkownik by. prze-
konany o mo5liwo/ci korzystania z aplikacji bez obaw o z.o/liwe czy ryzykowne dzia.ania.

NajwiHksz8 wad8 bezpo/redniego publikowania powiadomie: aplikacji jest ograniczona liczba
generowanych aktualizacji. Je/li aplikacja nie do/T skutecznie zachHca u5ytkownika do dzia-
.a:,  które  powoduj8  wysy.anie  powiadomie:,  wiHkszo/T  u5ytkowników  nie  bHdzie  godzi.a
siH na umieszczanie nowych elementów w swoich strumieniach aktywno/ci, zatem przekaz
promuj8cy aplikacjH nie bHdzie trafia. do ich znajomych. U5ytkowników kontenera aplikacji
spo.eczno/ciowych  bardzo  szybko  zniechHca  nadmiar  powiadomie:  wysy.anych  do  znajo-
mych  przez  zainstalowan8  aplikacjH.  Poniewa5  wiHkszo/T  kontenerów  udostHpnia  funkcje
blokowania umieszczania takich powiadomie: w strumieniu u5ytkownika, programista, który
w ten sposób chce promowaT swoj8 aplikacjH, musi stale mieT na uwadze ryzyko przekrocze-
nia akceptowanej liczby aktualizacji.

Aby ograniczyT to ryzyko, nale5y dobrze zaplanowa8, jakie zdarzenia w ramach aplikacji bHd8
stanowi.y  dobr8  okazjH  do  jej  promowania  (zarówno  z  perspektywy  u5ytkownika,  którego
strumie: aktywno/ci zostanie u5yty, jak i z punktu widzenia znajomych tego u5ytkownika,
którzy otrzymaj8 odpowiednie powiadomienia). Umieszczanie w strumieniu aktywno/ci u5yt-
kownika zbyt du5ej liczby aktualizacji jest najkrótsz8 drog8 do ca.kowitego zablokowania
powiadomie:  generowanych  przez  tH  aplikacjH.  Powiadomienia  nale5y  umieszczaT  w  stru-
mieniu aktywno/ci z umiarem.

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Pasywne i bezpo!rednie publikowanie powiadomie' aplikacji

 

207

Bezpo/rednie publikowanie powiadomie: aplikacji polega na prezentowaniu zachHt do dzia.a-
nia, które przekonaj8 u5ytkownika do opublikowania aktualizacji aplikacji w jego strumieniu
aktywno/ci:

<div id="msgNode"></div>
<div id="shareMsg">
   PrzekaU znajomym, Ue zaktualizowa@eA swój profil i zarobi@eA 5 dolarów w walucie aplikacji!<br />
   <button onclick="addActivity();">Publikuj</button>
</div>

<script type="text/javascript">
// generuje -+danie utworzenia nowego powiadomienia
function addActivity(){
   osapi.activities.create({
      userId: "@viewer",
      activity: {
         title: "Zaktualizowa@em swój profil - kliknij, aby przeczytaQ o tych aktualizacjach",
         url: "http://www.container.com/myapp"
      }
   }).execute(function(){
      // powiadomienie zosta/o opublikowane — wy(wietla si5 komunikat o pomy(lnym zako&czeniu operacji
      document.getElementById("msgNode").innerHTML = "Twoja wiadomoAQ zosta@a opublikowana";
      document.getElementById("shareMsg").style.display = "none";
      // kod dodaj+cy 5 dolarów waluty aplikacji do profilu u-ytkownika
   });
}
</script>

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

Po roz.o5eniu tego przyk.adu na elementy sk.adowe .atwo zauwa5yT, 5e u5ytkownik otrzy-
ma.  komunikat  tekstowy  i  przycisk  z  zachHt8  do  opublikowania  informacji  o  aktualizacji
swojego profilu. KlikniHcie przycisku Publikuj powoduje, 5e odpowiednie powiadomienie jest
umieszczane w jego strumieniu aktywno/ci, a sam u5ytkownik otrzymuje potwierdzenie tej
aktualizacji.

Pasywne publikowanie powiadomie' aplikacji

W  przeciwie:stwie  do  bezpo/redniego  publikowania  powiadomie:  pasywne  publikowanie
aktualizacji polega na umieszczaniu komunikatów w strumieniu aktywno/ci u5ytkownika
(i w jego imieniu) bez ka5dorazowego informowania i pytania o zgodH tego u5ytkownika. Model
pasywnego  publikowania  powiadomie:  mo5na  obserwowaT  w  takich  aplikacjach  jak  Four-
Square czy Gowalla, które rozsy.aj8 informacje o miejscu pobytu u5ytkownika za ka5dym razem,
gdy u5ytkownik loguje siH w tych serwisach. U5ytkownik co prawda ma /wiadomo/T, 5e
aplikacja  umieszcza  w  strumieniu  aktywno/ci  odpowiednie  powiadomienia  w  jego  imieniu
(wcze/niej wyrazi. na to zgodH), ale sam w 5aden sposób nie uczestniczy w procesie publiko-
wania poszczególnych aktualizacji.

Ta metoda publikacji powiadomie: ma swoje zalety i wady. U5ytkownik formalnie zezwoli.
aplikacji na publikowanie powiadomie: w swoim imieniu, jednak programista aplikacji ma
woln8 rHkH w kwestii wykorzystania tej zgody. NajwiHksz8 zalet8 tego modelu jest pewno/T,
5e  okre/lone  czynno/ci  u5ytkownika  spowoduj8  opublikowanie  w.a/ciwych  powiadomie:

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

208

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

(w przeciwie:stwie do modelu bezpo/redniej publikacji, gdzie jest wymagana ka5dorazowa
zgoda  u5ytkownika).  Oznacza to,  5e  aplikacja  dzia.aj8ca  wed.ug  tego  modelu  mo5e  publiko-
waT znacznie wiHcej aktualizacji w nadziei na dotarcie do wiHkszej liczby odbiorców.

NajwiHksza zaleta tego modelu jest jednocze/nie jego zasadnicz8 wad8 — Mród.em problemów
jest liczba powiadomie: wysy.anych w imieniu u5ytkownika bez jego ka-dorazowej zgody i bez
jego udzia/u w tym procesie

. Takie dzia.anie ma kilka negatywnych aspektów:

U5ytkownik musi z wyprzedzeniem wyraziT swoje zaufanie do aplikacji, aby umo5liwiT
jej dostHp do swojego profilu spo.eczno/ciowego i podejmowanie dzia.a: w jego imieniu.
Naruszenie tej relacji zaufania poprzez wysy.anie zbyt wielu aktualizacji mo5e spowodo-
waT ukrycie wszystkich powiadomie:, wycofanie zgody na publikacjH aktualizacji w imie-
niu u5ytkownika lub wrHcz ca.kowite odinstalowanie aplikacji.

Istnieje wiele aplikacji publikuj8cych liczne aktualizacje w strumieniach aktywno/ci swo-
ich u5ytkowników. Wszystkie te aktualizacje s8 widoczne dla znajomych tych u5ytkow-
ników. Je/li aplikacja umieszcza w strumieniu aktywno/ci u5ytkownika zbyt wiele aktu-
alizacji,  jego  znajomi  najprawdopodobniej  ukryj8  powiadomienia  generowane  przez  tH
aplikacjH lub wrHcz j8 odinstaluj8. Oznacza to, 5e zbyt du5a liczba aktualizacji wi85e siH
z ryzykiem utraty potencjalnej bazy u5ytkowników.

Warunkiem  skutecznego  publikowania  powiadomie:  (niezale5nie  od  wybranego  modelu)
jest umiar. Nie nale5y nadu5ywaT zaufania u5ytkownika i wysy.aT zbyt wielu aktualizacji —
w przeciwnym razie u5ytkownik bezpowrotnie straci zaufanie do aplikacji.

Zdarzeniem wywo.uj8cym pasywn8 publikacjH powiadomienia mo5e byT prosta aktualizacja
profilu u5ytkownika, która powoduje umieszczenie odpowiedniego komunikatu w strumieniu
aktywno/ci:

<!-- WSTAWIA: elementy formularza niezb5dne do aktualizacji profilu -->
Zaktualizuj swój profil
<button onclick="updateProfile();">Aktualizuj profil</button>

<script type="text/javascript">
// funkcja aktualizuj+ca profil u-ytkownika
function updateProfile (){
   // WSTAWIA: skrypty generuj+ce -+danie aktualizacji profilu u-ytkownika
   // generuje -+danie publikacji powiadomienia o aktualizacji profilu
   osapi.activities.create({
      userId: "@viewer",
      activity: {
         title: "Zaktualizowa@em swój profil - kliknij, aby przeczytaQ o tych aktualizacjach",
         url: "http://www.container.com/myapp"
      }
   }).execute();
</script>

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

Powy5szy  przyk.ad  pod  wieloma  wzglHdami  przypomina  kod  pokazany  przy  okazji  oma-
wiania bezpo/redniego publikowania powiadomie:. Jedyna ró5nica polega na tym, 5e doda-

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Pasywne i bezpo!rednie publikowanie powiadomie' aplikacji

 

209

nie nowego powiadomienia jest teraz /ci/le zwi8zane z aktualizacj8 profilu, a u5ytkownik nie
jest informowany o umieszczeniu nowego powiadomienia w strumieniu aktywno/ci (nie jest
te5 pytany o zgodH).

Przyk.adowa  aplikacja  udostHpnia wiele  pól  formularza, za  po/rednictwem  którego  u5yt-
kownik mo5e zaktualizowaT swój profil. Po wprowadzeniu zmian u5ytkownik mo5e klikn8T
przycisk zapisuj8cy nowe ustawienia. KlikniHcie tego przycisku powoduje wywo.anie funkcji,
która wysy.a na serwer 58danie aktualizacji profilu. Po wys.aniu tego 58dania odpowiednie
powiadomienie jest umieszczane w strumieniu aktywno/ci u5ytkownika (w jego imieniu) bez
5adnej informacji czy ostrze5enia dla samego u5ytkownika.

Zrównowa&one publikowanie powiadomie'

Jednym  ze  sposobów  wykorzystania  zalet  obu  modeli  (bezpo/redniego  i  pasywnego  publi-
kowania  powiadomie:)  i  jednocze/nie  unikania  ich  wad  jest  próba  zintegrowania  obu  roz-
wi8za: w ramach mechanizmu zrównowa-onego publikowania powiadomie+. Proponowana
technika, je/li jest prawid.owo stosowana, pozwala zagwarantowaT publikacjH okre/lonej liczby
powiadomie: w zwi8zku z dzia.aniami u5ytkownika, przy jednoczesnym zachowaniu relacji
zaufania .8cz8cej aplikacjH i tego u5ytkownika.

Technika zrównowa5onego publikowania powiadomie: bazuje na kilku podstawowych za.o-
5eniach. Programista powinien zacz8T od stosowania modelu pasywnego publikowania powia-
domie: i na podstawie zebranych do/wiadcze: okre/liT, które czynno/ci u5ytkownika powinny
powodowaT  publikowanie  aktualizacji.  Je/li  powiadomienia  publikowane  w  tym  trybie  s8
skojarzone z czHstymi czynno/ciami, aplikacja zasypie strumie: aktywno/ci u5ytkownika (bez
jego wiedzy) mnóstwem komunikatów. Pasywne publikowanie powiadomie: nale5y stosowaT
tylko dla najwa5niejszych dzia.a:, jak wykonanie przez u5ytkownika czasoch.onnego zada-
nia, uzyskanie rzadkiej odznaki czy wprowadzenie istotnych zmian w jego profilu lub tre/ci
aplikacji.  Takie  rozwi8zanie  pozwala  jednocze/nie  zagwarantowaT  promocjH  pewnej  liczby
zdarze: i wyeliminowaT ryzyko zmonopolizowania strumienia aktywno/ci u5ytkownika.

Dla  wszystkich  pozosta.ych  zdarze:,  które  powinny  powodowaT  umieszczanie  komunika-
tów w strumieniu  aktywno/ci,  nale5y  stosowaT  technikH  bezpo/redniej  publikacji  powiado-
mie:. Powiadomienia publikowane w tym trybie mog8 dotyczyT zaprosze:, pró/b o pomoc
lub okre/lon8 tre/T kierowanych do znajomych, udostHpniania znajomym tre/ci aplikacji itp.
ZachHty do dzia.ania mog8 byT bardziej kusz8ce, je/li zawieraj8 informacje o korzy/ciach
wynikaj8cych ze zgody na publikacjH aktualizacji — mo5e to byT zastrzyk wirtualnej gotówki
lub dostHp do rozmaitych ulepsze:.

Rozs8dne gospodarowanie aktualizacjami i utrzymanie relacji zaufania .8cz8cej aplikacjH
z u5ytkownikiem mo5e bardzo u.atwiT budowanie bogatej bazy promocji aplikacji przy u5yciu
strumienia  aktywno/ci.  W  idealnych  warunkach  to  u5ytkownicy  bHd8  promowali  aplikacjH
w/ród swoich znajomych, publikuj8c powiadomienia dotycz8ce wykonywanych przez siebie
czynno/ci.

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

210

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

Generowanie &%da' AJAX i &%da' dost$pu
do danych zewn$trznych

W trakcie normalnego funkcjonowania programu programista czHsto staje przed konieczno/ci8
modyfikacji kodu aplikacji lub rozszerzenia Mróde. danych serwera (na przyk.ad bazy danych)
o now8 tre/T. Aby upro/ciT to zadanie, specyfikacja OpenSocial definiuje metody obiektu http
dostHpne za po/rednictwem standardowej biblioteki JavaScriptu.

Programi/ci mog8 u5ywaT tej metody do generowania 58da: REST (

GET

PUT

POST

 i 

DELETE

)

pomiHdzy aplikacj8 a serwerem w celu zmodyfikowania stanu dzia.aj8cego systemu bez wp.ywu
na doznania u5ytkowników.

Do generowania tych 58da: s.u58 nastHpuj8ce metody obiektu 

osapi.http

:

osapi.http.get(urlparametry)

osapi.http.put(urlparametry)

osapi.http.post(urlparametry)

osapi.http.delete(urlparametry)

Oprócz adresu URL, na który ma zostaT wys.ane 58danie http, na wej/ciu wymienionych metod
mo5na dodatkowo przekazywaT wiele ró5nych parametrów. DostHpne parametry opisano
w tabeli 6.2.

Tabela 6.2. Parametry -+da& obiektu http

Parametr

Opis

authz (%a&cuch)

Metoda autoryzacji u0ywana podczas wysy'ania danych na serwer. Parametr
mo0e mie& warto%& 

none

 (domy%lnie), 

signed

 lub 

oauth

.

body (%a&cuch)

Stosowane tylko dla 0$da+ 

PUT

 i 

POST

. Dane wysy'ane na serwer w ramach 0$dania.

format (%a&cuch)

Format zwracanych danych. Parametr mo0e mie& warto%& 

json

 (domy%lnie)

lub 

text

.

headers (%a&cuch lub tablica %a&cuchów)

Opcjonalne nag'ówki wysy'ane wraz z 0$daniem danych.

oauth_service_name (%a&cuch)

Element 

service

 w specyfikacji gad0etu, który ma zosta& u0yty w tym 0$daniu.

Domy%ln$ warto%ci$ tego parametru jest 'a+cuch pusty ("").

oauth_token_name (%a&cuch)

Token standardu OAuth stosowany w tym 0$daniu. Domy%ln$ warto%ci$ tego
parametru jest 'a+cuch pusty ("").

oauth_request_token (%a&cuch)

Token wst,pnie zaakceptowany przez dostawc, (dla tre%ci b,d$cej przedmiotem
0$dania).

oauth_request_token_secret (%a&cuch)

Tajny klucz skojarzony z tokenem 

request_token

.

oauth_use_token (%a&cuch)

Okre%la, czy w 0$daniu nale0y u0y& tokenu standardu OAuth. Parametr mo0e
mie& warto%& 

always

if_available

 lub 

never

.

refreshInterval (liczba ca%kowita)

Okres, w którym kontener mo0e przechowywa& zwrócone dane w swojej pami,ci
podr,cznej.

sign_owner (warto+, logiczna)

Okre%la, czy 0$danie powinno by& autoryzowane (podpisane) i czy ma obejmowa&
identyfikator w'a%ciciela. Parametr domy%lnie ma warto%& 

true

.

sign_viewer (warto+, logiczna)

Okre%la, czy 0$danie powinno by& autoryzowane (podpisane) i czy ma obejmowa&
identyfikator bie0$cego u0ytkownika. Parametr domy%lnie ma warto%& 

true

.

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Generowanie &%da' AJAX i &%da' dost$pu do danych zewn$trznych

 

211

Znaczna czH/T 58da: dotycz8cych danych, które nie wymagaj8 zabezpiecze:, obejmuje zale-
dwie kilka z opisanych parametrów, w tym 

format

body

 (w przypadku 58da: 

POST

 i 

PUT

) oraz

refreshInterval

 (w celu poprawienia wydajno/ci).

Parametry 

authz

sign_*

 oraz 

oauth_*

 stosuje siH w sytuacji, gdy 58danie danych wymaga zabez-

pieczenia i gdy odbiorca musi potwierdziT to5samo/T nadawcy tego 58dania.

Generowanie standardowych &%da' dost$pu do danych

Je/li budowany serwis wymaga bezpiecznego przesy.ania danych, dostHp do zdecydowanej
wiHkszo/ci tych danych bHdzie siH odbywa. za po/rednictwem standardowych 58da: serwera
RESTful. Do generowania tych standardowych 58da: s.u5y wywo.anie 

osapi.http.metoda

, gdzie

s.owo 

metoda

 nale5y zast8piT typem 58dania, czyli 

get

put

, post lub 

delete

.

Poniewa5 omawiane rozwi8zania wymagaj8 stosowania funkcji biblioteki 

osapi

 jHzyka Java-

Script, nale5y dodaT wyra5enie 

Require

, aby by.o mo5liwe korzystanie z metod generowania

58da:. Po udostHpnieniu wspomnianych metod mo5na przyst8piT do  utworzenia praktycz-
nego przyk.adu, który bHdzie pobiera. dane z zewnHtrznego Mród.a i wy/wietla. uzyskan8
w ten sposób tre/T w oknie aplikacji.

Poni5szy przyk.ad kodu generuje 58danie 

GET

 wysy.ane do serwisu Flickr przy u5yciu jHzyka

YQL (od ang. Yahoo! Query Language). w8danie zwraca fotografie pasuj8ce do wyszukiwanego
s.owa Montreal. Otrzymane wyniki s8 nastHpnie przetwarzane — ka5de zdjHcie jest otaczane
znacznikami 

<img>

 i wy/wietlane w ramach okna aplikacji:

<?xml version="1.0" encoding="utf-8"?>
<Module>
   <ModulePrefs title="qudanie GET do serwisu Flickr za pomocu jRzyka YQL">
      <Require feature="osapi"/>
   </ModulePrefs>
   <Content type="html" view="canvas">
      <![CDATA[
      <div id="imgContainer"></div>

      <script type="text/javascript">
      // Wywo/anie zwrotne dla -+dania GET
      function requestCallback(response){
         var photolist = response.content.query.results.photo, html = "";

         // przeszukuje w p5tli kolejne obrazy i tworzy znaczniki <img>
         for (var i in photolist){
            if (photolist.hasOwnProperty(i)){
               html += "<img src='http://farm" + photolist[i].farm +
                       ".static.flickr.com/" + photolist[i].server +
                       "/" + photolist[i].id +
                       "_" + photolist[i].secret +
                       ".jpg' alt='" + photolist[i].title +"' /><br />";
               document.getElementById('imgContainer').innerHTML = html;
            }
         }
      }

      // generuje -+danie GET
      var url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20flickr.photos.
       search%20where%20text%3D%22Montreal%22&format=json";

      osapi.http.get({
         "href": url,

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

212

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

         "format": "json"
      }).execute(requestCallback);
      </script>
      ]]>
   </Content>
</Module>

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

W  pierwszym  kroku  zdefiniowano  specyfikacjH  gad5etu  niezbHdn8  do  uruchomienia  tego
przyk.adu, w szczególno/ci element 

Require

 dla biblioteki 

osapi

 (w ramach elementu 

ModulePrefs

).

W kolejnym kroku utworzono sekcjH 

Content

 wy/wietlaj8c8 widok kanwy aplikacji.

W.a/ciwe  wykonywanie  programu  rozpoczyna  siH  w  dolnej  czH/ci  sekcji 

Content

.  Zdefinio-

wano tam adres URL, na który zostanie wys.ane 58danie (w tym przypadku u5yto adresu
us.ugi YQL z .a:cuchem wyszukiwania dla serwisu Flickr). Bezpo/rednio potem wywo.ano
metodH 

our osapi.http.get(...)

, aby zainicjowaT to 58danie. Na wej/ciu tej metody przekazano

wspomniany adres URL (za po/rednictwem parametru 

href

) i okre/lono, 5e oczekiwanym wyni-

kiem tego 58dania jest obiekt JSON. Ostatnim elementem tej czH/ci kodu jest wys.anie 58dania
za pomoc8 metody 

execute(...)

. Na wej/ciu tej metody przekazano referencjH do funkcji wywo-

.ania zwrotnego, która ma zostaT wykonana po zwróceniu odpowiedzi dla 58dania.

Po  zako:czeniu  przetwarzania  58dania  nastHpuje  wywo.anie  funkcji 

requestCallback

,  która

otrzymuje na wej/ciu (za po/rednictwem parametru) obiekt odpowiedzi. Dalsza czH/T kodu
odpowiada za przetworzenie otrzymanych warto/ci — u5yta pHtla for przeszukuje poszcze-
gólne obiekty na li/cie.

Dla  ka5dej  fotografii  znalezionej  na  li/cie  jest  generowany  fragment  kodu  jHzyka  HTML  ze
znacznikami 

<img>

 i odwo.aniem do odpowiedniego adresu URL w ramach serwisu Flickr. Po

wygenerowaniu tre/ci w formacie HTML dla wszystkich obrazów gotowy .a:cuch jest umiesz-
czany w wHMle 

div

 skonfigurowanym na pocz8tku sekcji 

Content

.

Umieszczanie tre!ci w &%daniach danych

W niektórych przypadkach wraz z 58daniem nale5y wys.aT na serwer okre/lon8 tre/T. w8danie
mo5e  dotyczyT  na  przyk.ad  umieszczenia  na  serwerze  nowych  ustawie:  konfiguracyjnych
u5ytkownika, czyli aktualizacji rekordu tego u5ytkownika w bazie danych:

<label for="user"></label>
<input type="text" name="user" id="user" /><br />
<label for="pass"></label>
<input type="hidden" name="pass" id="pass" />
<button onclick="updateRecord();">Aktualizuj dane uUytkownika</button>
<div id="response"></div>

<script type="text/javascript">
function updateRecord(){
   // ustawia adres URL i wysy/ane dane
   var url = "http://www.mysite.com/updateUser.php";
   var postData = "user=" +
      encodeURIComponent(document.getElementById("user").value) + "&pass=" +
      encodeURIComponent(document.getElementById("pass").value);

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Generowanie &%da' AJAX i &%da' dost$pu do danych zewn$trznych

 

213

   // wysy/a obiekt danych pod wskazany adres URL (-+danie POST)
   osapi.http.post({
      "href": url,
      "body": postData,
      "format": "text"
   }).execute(function(response){
      document.getElementById("response").innerHTML = "Wys@ano dane";
   });
}
</script>

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

W  ramach  58dania  POST  umieszczono  kod  jHzyka  znaczników,  aby  umo5liwiT  u5ytkowni-
kowi podanie nazwy i has.a. Obie warto/ci reprezentuj8 informacje, które zostan8 przekazane
na serwer w celu zaktualizowania rekordu u5ytkownika. W powy5szym kodzie zdefiniowano
te5 wHze. 

div

, w którym bHdzie wy/wietlane potwierdzenie wys.ania 58dania. KlikniHcie przy-

cisku przez u5ytkownika spowoduje wywo.anie funkcji 

updateRecord()

.

W ciele funkcji 

updateRecord()

 ustawiono adres URL, na który zostanie wys.ane 58danie, oraz

wygenerowano  pary  klucz-warto/T  58dania 

POST

  na  podstawie  pól  z  danymi  wej/ciowymi.

Kolejne pary oddzielono znakiem 

&

.

I wreszcie przedstawiony kod generuje 58danie 

POST

 protoko.u HTTP za pomoc8 metody 

osapi.

 

http.post(...)

 otrzymuj8cej na wej/ciu adres URL, format i dane, które maj8 zostaT wys.ane

w ramach tego 58dania. Metoda 

execute()

 generuje 58danie i wywo.uje funkcjH zwrotn8 po

jego przetworzeniu. Funkcja zwrotna umieszcza w wHMle 

div

 prosty komunikat o pomy/lnym

przebiegu operacji.

U&ywanie autoryzowanych &%da' do zabezpieczania po#%cze'

W przypadku standardowych 58da: protoko.u HTTP wysy.anych za po/rednictwem aplika-
cji korzystaj8cej z metod obiektu 

osapi.http

 to kontener pe.ni funkcjH po/rednika i przekazuje

bezpo/rednio na serwer wszystkie parametry do.8czone do 58dania. W tym modelu kontener
w 5aden sposób nie modyfikuje przekazywanych parametrów (patrz rysunek 6.2).

Rysunek 6.2. U-ytkownik generuj+cy -+danie do zewn5trznego serwisu internetowego za po(rednictwem
kontenera bez autoryzacji OAuth

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

214

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

W przypadku pobierania danych z zewnHtrznego Mród.a, które nie wymaga stosowania zabez-
piecze: ani weryfikacji to5samo/ci u5ytkownika, opisany powy5ej model (z niezabezpieczonym
transferem danych) w zupe.no/ci wystarczy.

Warto  jednak  przeanalizowaT  nieco  inny  scenariusz  generowania  58dania.  Przypu/Tmy,  5e
zamiast pobieraT przypadkowe, niewra5liwe dane, generujemy 58danie 

POST

, aby zaktualizo-

waT na serwerze dane u5ytkownika. Wszystkie parametry przekazywane na serwer, w tym
identyfikator u5ytkownika, s8 ustawiane w kodzie samej aplikacji. Poniewa5 58danie nie jest
w 5aden sposób zabezpieczone, ka5dy u5ytkownik mo5e odczytaT te dane za pomoc8 Firebuga
lub tak zmodyfikowaT 58danie, aby zmieniT lub uzyskaT informacje o innym u5ytkowniku.
Na rysunku 6.3 pokazano 58danie wys.ane na serwer, które sprawia wra5enie w pe.ni popraw-
nego, mimo 5e w rzeczywisto/ci przekazuje kontrolH nad danymi u5ytkownika innemu, nie-
uprawnionemu u5ytkownikowi.

Rysunek 6.3. Z/o(liwy u-ytkownik generuje -+danie do zewn5trznego serwisu, skutecznie podszywaj+c si5
pod innego u-ytkownika (wskutek braku autoryzacji OAuth)

W.a/nie takim przypadkom mo5na zapobiec, stosuj8c autoryzowane 58dania, które mo5na
generowaT za pomoc8 metod obiektu 

osapi.http

 standardu OpenSocial. Autoryzowane (pod-

pisane) 58dania umo5liwiaj8 programistom przekazywanie parametrów pomiHdzy aplikacj8
a serwerem, jednak w tym przypadku kontener aplikacji jest nieporównanie bardziej aktywny.
Kontener, do którego trafia autoryzowane 58danie (patrz rysunek 6.4), sprawdza to5samo/T
u5ytkownika wystHpuj8cego w roli nadawcy i do.8cza do 58dania odpowiedni identyfikator.
Oprócz tego identyfikatora kontener dodaje do 58dania zaszyfrowany skrót, który umo5liwia
weryfikacjH poprawno/ci identyfikatora przez niezale5n8, zewnHtrzn8 us.ugH.

Rysunek 6.4. U-ytkownik generuj+cy -+danie do zewn5trznego serwisu internetowego za po(rednictwem
kontenera z wykorzystaniem autoryzacji OAuth

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Generowanie &%da' AJAX i &%da' dost$pu do danych zewn$trznych

 

215

Dodatkowa weryfikacja oznacza, 5e atak polegaj8cy na próbie sfa.szowania to5samo/ci u5yt-
kownika i wys.ania na serwer danych uwierzytelniaj8cych innego u5ytkownika zako:czy siH
niepowodzeniem, poniewa5 sfa.szowane dane i tak zostan8 nadpisane przez dane uwierzy-
telniaj8ce w.a/ciwego u5ytkownika. Je/li dane u5ytkownika zostan8 potwierdzone, w ramach
58dania mo5na dodatkowo przekazaT takie parametry jak identyfikator bie58cego u5ytkow-
nika i w.a/ciciela czy identyfikator aplikacji (patrz rysunek 6.5).

Rysunek 6.5. Z/o(liwy u-ytkownik generuje -+danie do zewn5trznego serwisu, ale nie mo-e skutecznie
podszywa8 si5 pod innego u-ytkownika z powodu zastosowania mechanizmu autoryzacji OAuth

W  przypadku  wygenerowania  autoryzowanego  (podpisanego)  58dania  serwer  docelowy
zawsze otrzymuje nastHpuj8ce parametry:

opensocial_owner_id

Unikatowy identyfikator w.a/ciciela aplikacji.

opensocial_app_url

Pe.ny adres URL aplikacji, która wygenerowa.a dane 58danie.

Poza wymienionymi powy5ej wymaganymi parametrami kontenery mog8 te5 wysy.aT dodat-
kowe informacje u.atwiaj8ce weryfikacjH, w tym:

opensocial_viewer_id

Unikatowy identyfikator bie58cego u5ytkownika aplikacji.

opensocial_instance_id

Okre/la, czy kontener powinien obs.ugiwaT wiele instancji tej samej aplikacji. Za po/red-
nictwem tego parametru nale5y przekazaT identyfikator instancji aplikacji wysy.aj8cej dane
58danie. PomiHdzy parametrami 

opensocial_instance_id

 i 

opensocial_app_url

 mo5na wskazaT

instancjH konkretnej aplikacji dzia.aj8cej w kontenerze.

opensocial_app_id

Unikatowy  identyfikator  aplikacji.  Ten  parametr  s.u5y  przede  wszystkim  zachowaniu
zgodno/ci wstecz z wersj8 0.7 specyfikacji OpenSocial.

xoauth_public_key

Klucz publiczny u5yty do podpisania danego 58dania. Je/li kontener nie stosuje kluczy
publicznych do podpisywania 58da: lub je5eli wykorzystuje alternatywne metody prze-
kazywania kluczy w ramach 58da:, ten parametr mo5na pomin8T.

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

216

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

Oprócz  wymienionych  powy5ej  parametrów  na  serwer  mo5na  dodatkowo  wysy.aT  dane
uwierzytelniaj8ce standardu OAuth umo5liwiaj8ce weryfikacjH autoryzowanych 58da:. Do tej
grupy parametrów nale58:

oauth_consumer_key

oauth_nonce

oauth_signature

oauth_signature_method

oauth_timestamp

oauth_token

Samo wygenerowanie podpisanego (autoryzowanego) 58dania nie gwarantuje pe.nej ochrony
przed manipulacjami. Serwer docelowy 58dania musi jeszcze wykonaT dodatkowe kroki zwi8-
zane z weryfikacj8 autoryzowanego 58dania, aby potwierdziT poprawno/T nades.anych danych.

Generowanie autoryzowanego &%dania

Utworzenie podpisanego (autoryzowanego) 58dania wymaga po.8czenia standardowej sk.adni
58da:, któr8 stosowano ju5 we wcze/niejszych przyk.adach, z parametrem 

authz

:

// generuje podpisane -+danie GET protoko/u HTTP
osapi.http.get({
   'href' : 'http://www.mysite.com/editUser.php',
   'format' : 'json',
   'authz' : 'signed'
}).execute(callback);

W ramach tego 58dania 

GET

 zdefiniowano adres URL, na który ma zostaT wys.ane podpisane

58danie, wskazano format danych i — co najwa5niejsze — okre/lono, 5e 58danie ma byT pod-
pisane (parametr 

authz

). Powy5szy kod generuje wiHc podpisane 58danie 

GET

 protoko.u HTTP.

Weryfikacja podpisanego &%dania po stronie serwera

Jak ju5 wspomnia.em, samo wygenerowanie i wys.anie podpisanego 58dania na serwer nie wy-
starczy do zagwarantowania poprawno/ci tego 58dania. Z.o/liwy u5ytkownik mo5e podj8T próbH
fa.szowania tak5e autoryzowanych 58da:. Do weryfikacji podpisanych 58da: pod k8tem pocho-
dzenia z w.a/ciwego Mród.a programista mo5e wykorzystaT podpis standardu OAuth.

Weryfikacja  58da:  przy  u5yciu  tego  mechanizmu  bHdzie  wymaga.a  kilku  dodatkowych
elementów:

Biblioteki OAuth (dostHpnej na stronie http://code.google.com/p/oauth/) niezbHdnej do wery-
fikacji  58da:  po  stronie  serwera.  W  tym  przyk.adzie  bHdzie  stosowana  biblioteka  PHP
OAuth 1.0 Rev A (dostHpna pod adresem http://oauth.googlecode.com/svn/code/php/).

Je/li kontener stosuje metodH weryfikacji na bazie certyfikatu klucza publicznego, bHdzie
potrzebny  odpowiedni  certyfikat.  ListH  certyfikatów  z  kluczami  publicznymi  dla  wielu
ró5nych kontenerów oraz adresy us.ug sprawdzania tych certyfikatów mo5na znaleMT na
stronie https://opensocialresources.appspot.com/certificates/. Wspomniany serwis nale5y jednak
traktowaT wy.8cznie jako pomocnicze Mród.o, poniewa5 jego tre/T nie jest aktualizowana
ani  aprobowana  przez  twórców  kontenerów.  Aby  zintegrowaT  najlepsze  mechanizmy
zabezpiecze:, nale5y zapoznaT siH z dokumentacj8 kontenera i znaleMT najbardziej aktu-
alny certyfikat klucza publicznego.

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Generowanie &%da' AJAX i &%da' dost$pu do danych zewn$trznych

 

217

Weryfikacja  podpisanego  58dania  sk.ada  siH  z  dwóch  kroków.  Po  pierwsze,  w  kodzie  po
stronie klienta nale5y odpowiednio przygotowaT podpisane 58danie na potrzeby skryptu po
stronie serwera. NastHpnie trzeba przetworzyT parametry przes.ane do skryptu po stronie
serwera i sprawdziT ich poprawno/T za pomoc8 elementów biblioteki OAuth. Ca.y ten dwu-
etapowy proces zosta. omówiony poni5ej.

Generowanie podpisanego &%dania w kodzie JavaScriptu

Wygenerowanie podpisanego 58dania w warstwie kodu jHzyka JavaScript (w ramach sekcji

Content

  specyfikacji  gad5etu)  spowoduje  przekazanie  danych  uwierzytelniaj8cych  biblioteki

OAuth, kontenera i u5ytkownika w celu sprawdzenia poprawno/ci 58dania po stronie serwera.

Wygenerowanie takiego 58dania sprowadza siH do utworzenia podpisanego 58dania 

osapi.

 

http.get

 adresowanego do skryptu po stronie serwera (podobnie jak w podpunkcie „Gene-

rowanie autoryzowanego 58dania” we wcze/niejszej czH/ci tego podrozdzia.u):

<?xml version="1.0" encoding="utf-8"?>
<Module>
   <ModulePrefs title="Weryfikacja podpisanego Uudania AJAX">
      <Require feature="opensocial-0.9"/>
      <Require feature="osapi"/>
   </ModulePrefs>
   <Content type="html" view="canvas">
      <![CDATA[
      <div id="validationResponse"></div>

      <script type="text/javascript">
      function dataCallback(response){
         document.getElementById("validationResponse").innerHTML =
            "qudanie zweryfikowane jako: " + response.data.validation;
      }

      osapi.http.get({
         "href" : "http://www.mysite.com/validate.php",
         "format" : "text",
         "authz" : "signed"
      }).execute(dataCallback);
      </script>
      ]]>
   </Content>
</Module>

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

Sam  gad5et  zawiera  wyra5enia 

Require

  dla  58dania 

osapi.http.get(...)

  i  sekcjH 

Content

  nie-

zbHdn8 do wykonywania tych skryptów. We wspomnianej sekcji 

Content

 umieszczono wHze. 

div

,

w którym bHdzie wy/wietlany komunikat o wyniku weryfikacji (komunikat bHdzie generowany
przez funkcjH wywo.ania zwrotnego oraz przez wywo.anie zwrotne samego 58dania proto-
ko.u HTTP). W aplikacji produkcyjnej nale5a.oby sprawdzaT komunikat i odpowiednio obs.u-
giwaT komunikat odes.any przez serwer w kodzie skryptu. Je/li odpowiedM serwera jest pra-
wid.owa i obejmuje nowy kod jHzyka znaczników, mo5na wstawiT ten kod na stronie. Je5eli
jednak odpowiedM jest nieprawid.owa, nale5y wy/wietliT stosowny komunikat o braku mo5-
liwo/ci realizacji 58dania (przynajmniej w danej chwili).

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

218

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

Wywo.anie metody 

osapi.http.get(...)

, które ma miejsce po wspomnianym wywo.aniu zwrot-

nym, generuje podpisane 58danie 

GET

 do skryptu po stronie serwera.

Weryfikacja podpisanego &%dania po stronie serwera
(algorytm RSA-SHA1 z certyfikatem klucza publicznego)

w8danie przekazywane (za po/rednictwem odpowiedniej warstwy kontenera) do skryptu po
stronie serwera — w tym przypadku funkcjH skryptu pe.ni plik http://www.mysite.com/validate.
php

 — powinno obejmowaT wszystkie parametry niezbHdne do weryfikacji, czyli dane uwie-

rzytelniaj8ce kontenera, u5ytkownika i biblioteki OAuth.

Wiele  popularnych  kontenerów  aplikacji  spo.eczno/ciowych  stosuje  certyfikaty  z  kluczami
publicznymi do weryfikacji 58da: przy u5yciu algorytmu RSA-SHA1. W poni5szym przyk.a-
dzie 58danie zostanie sprawdzone z wykorzystaniem jednego z takich certyfikatów.

Je/li kontener nie stosuje certyfikatów z kluczami publicznymi do weryfikacji 58da:
lub je5eli programista woli u5yT algorytmu HMAC-SHA1 zamiast RSA-SHA1, nale5y
wygenerowaT klucz tajny na poziomie kontenera i wykorzystaT ten klucz w miejsce
certyfikatu klucza publicznego.

<?php
require_once("OAuth.php");

class buildSignatureMethod extends OAuthSignatureMethod_RSA_SHA1 {
   public function fetch_public_cert(&$request) {
      return file_get_contents("http://www.fmodules.com/public080813.crt");
   }
}

// konstruuje -+danie na podstawie parametrów POST i GET
$request = OAuthRequest::from_request(null, null, array_merge($_GET, $_POST));

// tworzy now+ metod5 podpisu na podstawie utworzonej klasy i certyfikatu klucza publicznego
$signature_method = new buildSignatureMethod();

// sprawdza podpis
@$signature_valid = $signature_method->check_signature($request, null, null, $_GET
["oauth_signature"]);

$response = array();
if ($signature_valid) {
   // sprawdza podpisane -+danie i wysy/a komunikat o pomy(lnej weryfikacji
   $response['validation'] = "valid";
} else {
   // sprawdza podpisane -+danie i wysy/a komunikat o niepowodzeniu weryfikacji
   $response['validation'] = "invalid";
}

// wy(wietla obiekt odpowiedzi
print(json_encode($response));
?>

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Generowanie &%da' AJAX i &%da' dost$pu do danych zewn$trznych

 

219

Wyra5enie 

require_once(...)

  na  pocz8tku  tego  przyk.adu  wskazuje  plik  biblioteki  OAuth,

który pobrano wcze/niej ze strony http://oauth.googlecode.com/svn/code/php/.

Warto na pocz8tku zwróciT uwagH na skrypt weryfikacji w postaci klasy 

buildSignatureMethod

.

Wspomniana klasa rozszerza klasH 

OAuthSignatureMethod_RSA_SHA1

 zdefiniowan8 w pliku OAuth.php

i zawiera zaledwie jedn8 funkcjH odpowiedzialn8 za pobranie i zwrócenie zawarto/ci pliku
certyfikatu klucza publicznego. Danych zawartych w tym pliku nie nale5y pobieraT za ka5-
dym razem, gdy jakie/ podpisane 58danie wymaga weryfikacji. Nale5y raczej dodaT te dane
do pamiHci podrHcznej kluczy indeksowanej wed.ug wielu parametrów przekazywanych do
skryptu po stronie serwera. Zawarto/T tej pamiHci powinna byT aktualizowana tylko w przy-
padku zmiany wspomnianych warto/ci. Przekazywane parametry obejmuj8:

xoauth_signature_publickey

oauth_consumer_key

oauth_signature_method

W  kolejnym  kroku  skonstruowano  nowy  obiekt  58dania  OAuth  na  podstawie  parametrów

GET

 i 

POST

 przes.anych w ramach 58dania protoko.u HTTP. Przekazane warto/ci obejmuj8 para-

metry standardu OAuth i kontenera do.8czone do 58dania przez skrypt po/rednicz8cy, który
wygenerowa. to 58danie na poziomie kontenera. Obiekt 58dania OAuth zostanie u5yty do
weryfikacji przekazanego podpisu. Za pomoc8 klasy uzyskuj8cej certyfikat klucza publicznego
mo5na zbudowaT nowy podpis (na podstawie tego certyfikatu).

Metoda 

check_signature(...)

 jest wywo.ywana w celu sprawdzenia przekazanego podpisu

i zapisania wyniku weryfikacji. Zale5nie od efektu weryfikacji skrypt zapisuje komunikat o suk-
cesie b8dM niepowodzeniu i odsy.a do skryptu po stronie klienta obiekt odpowiedzi w for-
macie JSON.

Weryfikacja podpisanego &%dania po stronie serwera (algorytm HMAC-SHA1)

Je/li certyfikat klucza publicznego jest niedostHpny dla kontenera, w którym dzia.a aplikacja,
mo5na  zastosowaT  alternatywny  model  weryfikacji  podpisanych  58da:  po  stronie  serwera.
Zamiast algorytmu RSA-SHA1 nale5y wówczas u5yT algorytmu HMAC-SHA1.

Zamiast pos.ugiwaT siH certyfikatem klucza publicznego w roli metody weryfikacji 58dania,
programista mo5e wygenerowaT nowy obiekt 58dania OAuth na podstawie danych przes.anych
w ramach podpisanego 58dania:

<?php
require_once("OAuth.php");

$key = "TUTAJ NALEqY ZDEFINIOWA KLUCZ";
$secret = "TUTAJ NALEqY ZDEFINIOWA KLUCZ";

// Konstruuje nowy obiekt -+dania na podstawie bie-+cego -+dania
$request = OAuthRequest::from_request(null, null, $_REQUEST);
$consumer = new OAuthConsumer($key, $secret, null);

// inicjalizuje metod5 podpisu
$sig_method = new OAuthSignatureMethod_HMAC_SHA1();

// sprawdza przekazany podpis OAuth
$signature = $_GET['oauth_signature'];
$valid_sig = $sig_method->check_signature(
   $request,
   $consumer,

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

220

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

   null,
   $signature
);

// sprawdza, czy podpis zosta/ prawid/owo zweryfikowany
if (!$valid_sig) {
   // NIEPRAWIDROWY PODPIS — nale-y wygenerowa8 odpowiedni komunikat o b/5dzie
} else{
   // PRAWIDROWY PODPIS — program mo-e kontynuowa8 dzia/anie
}
?>

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

Podobnie jak w poprzednim przyk.adzie, powy5szy kod zaczyna siH od do.8czenia biblioteki
OAuth jHzyka PHP (dostHpnej na stronie http://oauth.googlecode.com/svn/code/php/). DziHki temu
mo5na utworzyT w.asny obiekt 58dania OAuth i obiekt odbiorcy (tzw. konsumenta), po czym
sprawdziT przekazany podpis. Oprócz wspomnianej biblioteki w kodzie do.8czono odbiorcH
58dania OAuth (obiekt odbiorcy 58dania OAuth zostanie skonstruowany na podstawie zmien-
nych reprezentuj8cych klucze).

W kolejnym kroku nale5y skonstruowaT obiekty 58dania OAuth i jego odbiorcy. W tym celu
wywo.ujemy  najpierw  metodH 

OAuthRequest::from_request(...)

,  aby  zbudowaT  obiekt  58da-

nia. Za po/rednictwem pierwszych dwóch parametrów przekazano warto/T 

null

, poniewa5

w tym przypadku wspomniane parametry nie s8 wymagane. Parametry te reprezentuj8 odpo-
wiednio metodH protoko.u HTTP i adres URL. Za po/rednictwem trzeciego parametru prze-
kazano obiekt 

$_REQUEST

 zawieraj8cy wszystkie informacje na temat 58dania OAuth, które s8

niezbHdne do skonstruowania nowego obiektu. W kolejnym kroku utworzono nowy  obiekt

OAuthConsumer

, przekazuj8c na wej/ciu konstruktora klucz OAuth i klucz tajny. Trzecim para-

metrem tej metody jest adres URL wywo.ania zwrotnego dla procesu OAuth (w tym przypadku
przekazano warto/T 

null

).

Kolejnym niezbHdnym krokiem jest utworzenie nowego obiektu podpisu za pomoc8 wywo.ania
konstruktora 

OAuthSignatureMethod_HMAC_SHA1()

.  DziHki  temu  bHdzie  mo5liwe  porównywanie

podpisu reprezentowanego przez ten obiekt z podpisem przekazanym w ramach autoryzo-
wanego zdarzenia — na tej podstawie mo5na stwierdziT, czy drugi podpis jest prawid.owy.

Kolejny blok kodu rozpoczyna siH od odczytania podpisu OAuth przekazanego w ramach
autoryzowanego 58dania. Po odczytaniu tego podpisu nowy obiekt jest u5ywany do wywo-
.ania metody 

check_signature(...)

. Na wej/ciu tej metody (w roli listy parametrów) s8 prze-

kazywane: obiekt 58dania OAuth i obiekt odbiorcy OAuth, warto/T tokenu (w tym przypadku
jest niepotrzebna, st8d u5yta warto/T 

null

) i wreszcie podpis przekazany w ramach 58dania

i bHd8cy przedmiotem porównania.

Po  wykonaniu  wszystkich  tych  zada:  mo5na  wreszcie  u5yT  zwróconej  warto/ci  do  spraw-
dzenia, czy weryfikacja podpisu przebieg.a pomy/lnie (tj. czy podpis przekazany w ramach
58dania by. poprawny). Je/li tak, program mo5e kontynuowaT przetwarzanie podpisanego 58da-
nia. Je/li nie, kod powinien wy/wietliT komunikat o b.Hdzie.

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Budowanie kompletnego gad&etu

 

221

Budowanie kompletnego gad&etu

Kompletny kod Mród.owy tego przyk.adu jest dostHpny pod adresem ftp://ftp.helion.pl/
przyklady/prapse.zip

.

Skoro  dysponujemy  ju5  wiedz8  niezbHdn8  do  praktycznego  stosowania  funkcji  spo.eczno-
/ciowych gad5etu, warto wykorzystaT zdobyte umiejHtno/ci i opracowaT prosty gad5et. Gad5et
opracowany w tym podrozdziale bHdzie wy/wietla. strumie: aktywno/ci znajomych bie58cego
u5ytkownika i zdjHcia przypisane do ich profili oraz udostHpnia. u5ytkownikowi metodH doda-
j8c8 nowe powiadomienie do jego strumienia.

Nale5y najpierw przygotowaT kod znaczników nowego gad5etu. W tym przyk.adzie bHdzie
potrzebna tylko lekka biblioteka 

osapi

 jHzyka JavaScript, zatem nale5y j8 dodaT w budowanej

specyfikacji. Programista musi te5 zdefiniowaT widok, w którym bHdzie .adowany wHze. 

Content

:

<?xml version="1.0" encoding="UTF-8"?>
<Module>
   <ModulePrefs title="Przyk@ad dla rozdzia@u 6."
      description="WyAwietla uzyskane informacje spo@ecznoAciowe i formularz dodawania aktualizacji">
      <Require feature="opensocial-0.9"/>
      <Require feature="osapi" />
   </ModulePrefs>
   <Content type="html" view="canvas">
   <![CDATA[
      <!-- tre(8 widoku -->
   ]]>
   </Content>
</Module>

Nale5y teraz umie/ciT w wHMle 

Content

 odpowiednie style i kod jHzyka znaczników. Na potrzeby

tego przyk.adu zostan8 u5yte style rozmieszczaj8ce elementy na stronie oraz ustawiaj8ce
czcionkH,  kolory  i  odstHpy.  Kod  jHzyka  znaczników  zbuduje  kontener  podzielony  na  dwie
kolumny. Lewa kolumna bHdzie zawiera.a ostatnie aktualizacje dotycz8ce znajomych u5ytkow-
nika; prawa kolumna bHdzie wy/wietla.a obrazy profili dwunastu spo/ród tych znajomych.
Pod zdjHciami znajduje siH formularz, w którym u5ytkownik mo5e wpisaT tytu., opis i adres URL
przeznaczone do opublikowania w strumieniu aktywno/ci:

<style type="text/css">
div#gadget{ font:11px arial,helvetica,sans-serif; }
div#gadget div.header{ background-color:#858585;
                       color:#fff; font-weight:bold;
                       font-size:12px;
                       padding:5px;
                       margin:5px; }
div#gadget div#railRight{ width:360px;
                          float:right;
                          border:1px solid #858585;
                          margin:0 0 15px 15px;
                          padding:10px;
                          background-color:#eaeaea; }
div#gadget div#railRight div#friendLinks img{ border:0;
margin:5px;
width:50px;
height:50px; }

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

222

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

div#gadget div#railRight form{ margin:10px 5px; }
div#gadget div#railRight form label{ font-weight:bold; }
div#gadget div#railRight form input{ width:300px; }
div#gadget div#updates{ margin-left:5px;
                        margin-right:390px; }
div#gadget div#updates div.header{ margin:0; }
</style>

<div id="gadget">
   <div id="railRight">
      <div class="header">Pozosta@e profile</div>
      <div id="friendLinks"></div>
      <div class="header">WyAlij powiadomienie do znajomych</div>
      <form name="addActivity" onSubmit="return false;">
         <label for="title">Tytu@:</label><br />
         <input type="text" name="title" id="title" /><br />
         <label for="description">Opis:</label><br />
         <input type="text" name="description" id="description" /><br />
         <label for="url">Adres URL:</label><br />
         <input type="text" name="url" id="url" /><br /><br />
         <button onclick="socialController.addActivity();">Dodaj aktualizacjR</button>
      </form>
   </div>
   <div id="updates">
      <div class="header">Powiadomienia od Twoich znajomych</div>
      <div id="updateContent"></div>
   </div>
</div>

Ostatnim sk.adnikiem tego gad5etu jest warstwa kodu jHzyka JavaScript. Sekcja skryptu obej-
muje trzy funkcje odpowiedzialne za obs.ugH pobierania i ustawiania danych spo.eczno/ciowych
gad5etu. Wspomniane funkcje s8 stosowane w roli konstruktorów Mróde. danych spo.eczno/cio-
wych i mechanizmów promocji danych aplikacji w/ród znajomych bie58cego u5ytkownika:

<script type="text/javascript">
var socialController = {
   // uzyskuje zdj5cia (obrazy) przypisane do profili znajomych
   fetchProfile: function(insertID){
      // generuje -+danie GET dotycz+ce profili dwunastu znajomych u-ytkownika
      osapi.people.get({userId: "@viewer",
                        groupId: "@friends",
                        count: 12}).execute(function(result){
         var friends = result.list;
         var html = '';

         // dla ka-dego znalezionego znajomego wy(wietla obraz b5d+cy linkiem do odpowiedniego profilu
         for (var i = 0; i < friends.length; i++){
            html += "<a href='" + friends[i].profileUrl + "'><img src='"
                  + friends[i].thumbnailUrl + "' /></a>";
         }
         document.getElementById(insertID).innerHTML = html;
      });
   },

   // uzyskuje strumie& aktualizacji dla znajomych
   fetchUpdates: function(insertID){
      // generuje -+danie GET dotycz+ce strumieni aktywno(ci trzydziestu znajomych u-ytkownika
      osapi.activities.get({userId: "@viewer",
                            groupId: "@friends",
                            count: 30}).execute(function(result){

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Budowanie kompletnego gad&etu

 

223

         var activities = result.list; var html = '';

         // dla ka-dej czynno(ci tworzy tytu/ b5d+cy linkiem do jej Tród/a
         for (var i = 0; i < activities.length; i++){
            html += "<p><a href='" + activities[i].url + "'>"
                  + activities[i].title + "</a><br /></p>";
         }
         document.getElementById(insertID).innerHTML = html;
      });
   },

   // umieszcza nowe powiadomienie w strumieniu aktywno(ci bie-+cego u-ytkownika
   addActivity: function(){
      osapi.activities.create({userId: "@viewer", groupId: "@self",
         activity: {
            title: document.getElementById("title").value,
            body: document.getElementById("description").value,
            url: document.getElementById("url").value
         }
      }).execute();
   }
};

// inicjalizuje -+dania danych
socialController.fetchProfile("friendLinks");
socialController.fetchUpdates("updateContent");
</script>

Funkcja 

fetchProfile()

 uzyskuje adresy URL i zdjHcia przypisane do profili znajomych bie58-

cego u5ytkownika. Pobrane informacje s8 nastHpnie u5ywane do utworzenia zbioru znaczników
obrazów, które s8 umieszczane w kodzie jHzyka HTML gad5etu.

Funkcja 

fetchUpdates()

 pobiera aktualizacje ze strumieni aktywno/ci znajomych u5ytkownika,

tworzy kod jHzyka znaczników z tytu.ami w formie linków, po czym wstawia gotowy kod
HTML-a do lewej kolumny aplikacji. Ostatnia funkcja, nazwana 

addActivity()

, dodaje nowe

powiadomienie do strumienia aktywno/ci u5ytkownika (po wpisaniu tytu.u, opisu i adresu
URL w prawej kolumnie).

Dwa ostatnie wiersze tego bloku kodu JavaScriptu wywo.uj8 funkcje pobieraj8ce dane spo-
.eczno/ciowe i wype.niaj8ce widok aplikacji (w czasie jej .adowania). Podczas .adowania
gad5etu zostan8 wy/wietlone wszystkie elementy spo.eczno/ciowe zdefiniowane w wHz.ach 

div

(patrz rysunek 6.6).

Opisana aplikacja zawiera kilka podstawowych funkcji spo.eczno/ciowych, które mo5na
z powodzeniem wykorzystywaT do promocji w.asnych aplikacji i dostosowywania ich dzia.a-
nia do potrzeb u5ytkowników. Wystarczy zastosowaT choTby czH/T spo/ród zaproponowanych
rozwi8za:, aby lepiej odczytywaT preferencje u5ytkowników, sprowokowaT ich do promo-
wania aplikacji w naszym imieniu i uwzglHdniT w aplikacji wykaz znajomych u5ytkownika
w ramach serwisu spo.eczno/ciowego.

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

224

 

Rozdzia# 6. Aktywno!( u&ytkowników, publikowanie powiadomie' aplikacji i &%danie danych w kontenerze OpenSocial

Rysunek 6.6. Przyk/adowy gad-et dla rozdzia/u 6. ilustruj+cy sposoby operowania na strumieniu aktywno(ci
i profilach spo/eczno(ciowych

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

567

Skorowidz

<meta>, 403
<os:ActivitiesRequest>, 232
<os:DataRequest>, 228
<os:HttpRequest>, 229
<os:PeopleRequest>, 229

A

ActivitiesRequest, znacznik, 232, 233
Activity Streams, 18, 278, 421

czasowniki, 426, 427, 428, 429
opcjonalne atrybuty obiektu, 425
typy obiektów, 424, 426, 427

ActivityRequest, znacznik, 232
Address, obiekt, 184
addTab(), 130, 131
ADsafe, 18, 31, 312, 314

biblioteki, 328
do.8czanie zdarze:, 327
GET, 321, 322
kontra Caja, 313
metody, 315
obiekt, 314, 315
obiekt pakietu, 321
q, metoda, 317
SET, 322, 323, 324, 325
wybór wHz.ów DOM, 317

AJAX, 563
aktywno/T, 563
alignTabs(), 134
Apache, 558

instalacja w systemie Mac OS X, 559
instalacja w systemie Windows, 559, 560

Apache Shinding, Patrz Shinding
aplikacje

b.Hdy, 40
gra spo.eczno/ciowa ze znajomymi, 46, 47, 48,

49, 50

informacyjne, 45

kopiuj8ce widoki, 43
nierentowno/T, 44
odbiorcy, 57
promocja, 200
przeno/ne z animacjami, 41
sprzeda5y produktów, 50, 51, 52
uwzglHdniaj8ce po.o5enie u5ytkownika, 53, 54,

55, 56

zbyt du5o informacji, 43

App Engine, 562

instalacja, 562

ataki

cz.owiek po/rodku, 482
metod8 powtarzania, 482
odgadywanie hase. na bie58co, 481
pobieranie plików bez wiedzy u5ytkownika, 31
pods.uch, 482
podszywanie siH pod mechanizm weryfikacji, 482
przechwytywanie sesji, 482
przekierowanie u5ytkowników bez ich zgody, 290
rejestrowanie naciskanych klawiszy, 291, 293
/ledzenie historii przegl8darki, 290, 291
wykonanie kodu za pomoc8

document.createElement, 291

XSS, 30

Attribute Exchange, 471, 473

adresy, 473
data urodzenia, 474
komunikatory, 476
nazwisko, 476, 477
obrazy, 475
poczta elektroniczna, 475
pozdrowienia audio i wideo, 474
pozosta.e dane osobowe i preferencje

u5ytkownika, 478, 479

praca, 478
telefon, 477
witryny internetowe, 478

AX, Patrz Attribute Exchange

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

568

 

 Skorowidz

B

basic authentication, Patrz uwierzytelnianie

podstawowe

b.yskawiczny rozwój, 563
BodyType, obiekt, 185
bunch object, Patrz obiekt pakietu

C

Caja, 18, 31, 151, 288, 289, 306

dodawanie do gad5etu, 303
konfiguracja, 293, 294
kontra ADsafe, 313
uruchamianie z poziomu aplikacji

internetowej, 301

uruchamianie z poziomu wiersza polece:, 295
wymagania, 293
zabezpieczanie kodu HTML-a i JavaScriptu, 295
zmiana formatu kodu, 300

Caja Playground, 306
Content, sekcje, 103, 105, 106, 110
Context, zmienna, 248
createDismissibleMessage(), 123, 126
cross-site scripting, 30
ctype, parametr, 439, 440
Cur, zmienna, 249

D

data pipelining, Patrz potokowe przesy.anie

danych

DataRequest, znacznik, 228, 229
DELETE, 554, 555
displayTabs(), 134
document.createElement, 291
DOM, obiekt, 315, 317

metody, 316

drive-by download, 31

E

Email, obiekt, 185
entity relationships, Patrz relacje z podmiotami
Enum, obiekt, 186
enum, typ danych, 103

F

Facebook, 66, 67, 69

graf powi8za: spo.eczno/ciowych, 72, 75
implementacja Open Graph, 410, 411
kana.y komunikacji, 73

OAuth 2, 381, 382, 383
przenoszenie aplikacji do kontenera

OpenSocial, 152

finger, polecenie, 429
flash, biblioteka, 118
FQL, 153

G

gad5et, 563

animacja Flash, 118, 119
dodawanie Caja, 303
dynamiczne ustawianie wysoko/ci widoku,

117

typy komunikatów, 120
tytu., 129
wy/wietlanie komunikatów, 119, 120, 121, 122,

123, 124, 125, 126

wy/wietlanie przy u5yciu Shinding, 144
zak.adki, 130, 131, 132, 133
zapisywanie stanu z preferencjami

u5ytkownika, 127, 128

GET, 551
getBool(), 128
getCallback(), 135
getDataSet(), 234, 235
getIndex(), 136
getInt(), 128
getName(), 136
getNameContainer(), 136
getSelectedTab(), 134, 135
getString(), 128
getTabs(), 134, 135
Google, 68, 69
graf powi8za: spo.eczno/ciowych, 59, 60, 61, 72,

563

H

hAtom, 556
hCalendar, 556
hCard, 556
HEAD, 555
hMedia, 557
hNews, 557
hProduct, 557
hRecipe, 557
hResume, 557
hReview, 557
HTTP, kody odpowiedzi, 549, 550
http, obiekt, 210, 213, 214
HttpRequest, znacznik, 229, 230
hunter selector, Patrz selektor my/liwego

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Skorowidz

 

569

I

iframe, 29, 30, 151, 152, 153, 288
IRI, 563

J

Janrain OpenID, 497

instalacja, 497

JavaScript

dwuetapowa autoryzacja OAuth, 351, 352, 353
interfejs API, 265, 266
umieszczanie zdarze: w znacznikach, 309
wykrywanie niebezpiecznych elementów, 305

JSLint, 305, 306

K

kana.y komunikacji, 73
klaster jeden do wielu, 61
komunikat

czasowy, 120, 122, 123
statyczny, 120, 121, 122
z mo5liwo/ci8 zamkniHcia, 120, 121

kontener, 21, 22, 23, 27, 28, 563

aktualizacje, 28
czas pracy, 28
profil u5ytkownika, 23
strumie: aktywno/ci, 23, 24, 25
uszkodzone funkcje, 28
zmiany obs.ugiwanych funkcji, 28
znajomi i powi8zania, 23, 24

L

lokalizacja, 272, 273, 275
LRDD, 564

M

message bundle, Patrz pakiety komunikatów
metadane, 403
mikroformat, 556, 557
minimessage, biblioteka, 119
mmlib_table, 126
mmlib_xlink, 127
model

grupowy, 67, 68, 69, 70
opt-in, 63, 64
opt-out, 64
po.8cze:, 66, 67
/ledzenia, 65, 66

ModulePrefs, wHze., 97, 98

Icon, element, 99
Link, element, 100, 101
Locale, element, 99, 100
Optional, element, 98
Preload, element, 98, 99
Require, element, 98

My, zmienna, 249, 250

N

Name, obiekt, 187
newDataRequest(), 189, 190
newFetchPersonRequest(), 190
NIST, poziomy pewno/ci, 481

O

OAuth, 18, 32, 337, 340, 341, 348, 349
OAuth 1.0a

autoryzacja dwuetapowa, 350, 351, 352
autoryzacja trzyetapowa, 350, 354
brakuj8ce lub powtarzaj8ce siH parametry, 369
diagnozowanie b.Hdów, 369
dwukrotne kodowanie parametrów podpisu,

370

nieprawid.owa metoda podpisywania 58da:,

371

nieprawid.owe punkty ko:cowe URI, 370, 371
pobranie tokenu 58dania, 343, 344
pobranie zweryfikowanego przez

u5ytkownika tokenu 58dania, 345, 346

przep.yw pracy, 341
utrata wa5no/ci przez token, 372
uzyskanie klucza konsumenta i klucza tajnego,

341, 342

wymiana zweryfikowanego tokenu 58dania

na token dostHpu, 346, 347

OAuth 2, 373

diagnozowanie b.Hdów, 396
Facebook, 381, 382, 383
komunikaty o b.Hdach, 398, 399
parametry komunikatów o b.Hdach, 398
przep.yw pracy, 373
reagowanie na kody b.Hdów, 397
/ledzenie wa5no/ci tokenu dostHpu, 397
weryfikacja danych 58dania, 396

oauth_authorization_expires_in, 348
oauth_callback, 344
oauth_callback_confirmed, 344
oauth_consumer_key, 344, 347
oauth_expires_in, 344, 348
oauth_nonce, 344, 347

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

570

 

 Skorowidz

oauth_signature, 344, 347
oauth_signature_method, 344, 347
oauth_timestamp, 344
oauth_token, 344, 347
oauth_token_secret, 344
oauth_verifier, 347
oauth_version, 344, 347
obiekt pakietu, 321
obiekt spo.eczno/ciowy, 564
OExchange, 18, 433

dzia.anie, 433, 434
implementacja, 435, 437, 438
zastosowania, 434, 435

one-to-few cluster, Patrz klaster jeden do wielu
Open Graph, 18, 280, 402, 403

dane audio, 408
dane geolokalizacyjne, 405
dane kontaktowe, 406
dane wideo, 407
dzia.anie, 403, 404
implementacja, 404
implementacja w serwisie Facebook, 410, 411
wady, 419, 420

open source, 26, 547, 548

wady, 548
zalety, 547

OpenID, 18, 32, 461, 462, 463, 510

Attribute Exchange, Patrz Attribute Exchange
b.Hdy, 508, 509
decentralizacja, 462
dostawcy, 469
hybryda z OAuth, 511, 512, 514, 515, 516, 517,

519, 520

implementacja, 484
odkrywanie domen, 469, 471
Provider Authentication Policy Extension,

Patrz

 Provider Authentication Policy

Extension

rozszerzenia, 471, 483
Simple Registration, Patrz Simple Registration
uwierzytelnianie, 464
wady, 514
zalety, 514

OpenLike, 75, 76

integracja widgetu, 75

OpenSocial, 18, 145

Content, sekcje, 103, 105, 106, 110
jHzyk znaczników, 270, 271
kontener gad5etów spo.eczno/ciowych, 148,

149, 150

kontener OpenSocial, 148, 150
kontenery aplikacji zgodne ze standardem, 146
ModulePrefs, wHze., 97, 98

podstawowy kontener gad5etów, 147, 148
przysz.o/T, 276
REST, 275
serwer podstawowego interfejsu API, 147, 148
serwer spo.eczno/ciowego interfejsu API, 149
serwer spo.eczno/ciowych elementów API, 147
specyfikacja, 147
specyfikacja w formacie XML, 96, 97
szablony, 240, 241, 243, 244, 245, 246
UserPref, wHze., 97, 101, 102, 103

opensocial.newActivity(), 205
opensocial.newMediaItem(), 204
opensocial.Person.Field.ABOUT_ME, 160
opensocial.Person.Field.ACTIVITIES, 160
opensocial.Person.Field.ADDRESSES, 161
opensocial.Person.Field.AGE, 161
opensocial.Person.Field.BODY_TYPE, 162
opensocial.Person.Field.BOOKS, 162
opensocial.Person.Field.CARS, 163
opensocial.Person.Field.CHILDREN, 163
opensocial.Person.Field.CURRENT_LOCATION,

163

opensocial.Person.Field.DATE_OF_BIRTH, 164
opensocial.Person.Field.DRINKER, 164
opensocial.Person.Field.EMAILS, 165
opensocial.Person.Field.ETHNICITY, 165
opensocial.Person.Field.FASHION, 166
opensocial.Person.Field.FOOD, 166
opensocial.Person.Field.GENDER, 166
opensocial.Person.Field.HAPPIEST_WHEN, 167
opensocial.Person.Field.HAS_APP, 167
opensocial.Person.Field.HEROES, 168
opensocial.Person.Field.HUMOR, 168
opensocial.Person.Field.ID, 168
opensocial.Person.Field.INTERESTS, 169
opensocial.Person.Field.JOB_INTERESTS, 169
opensocial.Person.Field.JOBS, 170
opensocial.Person.Field.LANGUAGES_SPOKEN,

170

opensocial.Person.Field.LIVING_ARRANGEMENT,

171

opensocial.Person.Field.LOOKING_FOR, 171
opensocial.Person.Field.MOVIES, 172
opensocial.Person.Field.MUSIC, 172
opensocial.Person.Field.NAME, 172
opensocial.Person.Field.NETWORK_PRESENCE,

173

opensocial.Person.Field.NICKNAME, 173
opensocial.Person.Field.PETS, 174
opensocial.Person.Field.PHONE_NUMBERS, 174
opensocial.Person.Field.POLITICAL_VIEWS, 175
opensocial.Person.Field.PROFILE_SONG, 175
opensocial.Person.Field.PROFILE_URL, 175

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Skorowidz

 

571

opensocial.Person.Field.PROFILE_VIDEO, 176
opensocial.Person.Field.QUOTES, 176
opensocial.Person.Field.RELATIONSHIP_STATUS,

177

opensocial.Person.Field.RELIGION, 177
opensocial.Person.Field.ROMANCE, 177
opensocial.Person.Field.SCARED_OF, 178
opensocial.Person.Field.SCHOOLS, 178
opensocial.Person.Field.SEXUAL_ORIENTATION,

179

opensocial.Person.Field.SMOKER, 179
opensocial.Person.Field.SPORTS, 180
opensocial.Person.Field.STATUS, 180
opensocial.Person.Field.TAGS, 180
opensocial.Person.Field.THUMBNAIL_URL, 181
opensocial.Person.Field.TIME_ZONE, 181
opensocial.Person.Field.TURN_OFFS, 182
opensocial.Person.Field.TURN_ONS, 182
opensocial.Person.Field.TV_SHOWS, 183
opensocial.Person.Field.URLS, 183
opensocial.template, 266
opensocial.template.getTemplate(), 266
opensocial.template.process(), 267
opensocial.template.Template.render(), 267
opensocial.template.Template.renderInto(), 268
opensocial_app_id, 215
opensocial_app_url, 215
opensocial_instance_id, 215
opensocial_owner_id, 215
opensocial_viewer_id, 215
operatory porównywania, 248
Organization, obiekt, 187, 188
os:Badge, 270, 272
os:Get, 270, 272
os:Html, 260
os:If, 252
os:Name, 270, 271
os:PeopleSelector, 270, 271, 272
os:Render, 260, 261, 262
os:Repeat, 254
osapi.activities.create, 202, 203
osapi.people.get, 155, 192
osapi.people.getOwner, 158
osapi.people.getOwnerFriends, 159
osapi.people.getViewer, 156, 157, 191
osapi.people.getViewerFriends, 157
OSML, Patrz OpenSocial, jHzyk znaczników
OwnerRequest, znacznik, 231, 232

P

pakiety komunikatów, 273, 274, 275
PAPE, Patrz Provider Authentication Policy

Extension

parametry dynamiczne, 238, 239
Partuza, 18, 87, 88, 564

instalacja w systemie Mac OS X, 88, 89, 90
instalacja w systemie Windows, 91, 94, 95, 96
instalacja, testowanie, 96
wymagania, 88

PeopleRequest, znacznik, 229, 230, 231
Person, obiekt, 154

metody, 155
pola, 160
rozszerzanie, 183

pHtle, 253, 254, 256, 257

zagnie5d5one, 255

Phone, obiekt, 188, 189
PHP

budowanie subskrybenta, 450, 451, 452
budowanie wydawcy, 446
OAuth 1.0a, 355, 357, 359, 360, 361, 362
OAuth 2, 383, 384, 385, 386
OpenID, 485, 486, 487, 488, 489, 490, 492, 493,

494, 495, 496

uwierzytelnianie hybrydowe, 522, 523, 525,

527, 528, 529, 530, 531, 532, 533

wHze. Open Graph, 413, 414, 415, 416

PHP, /rodowisko, 560

instalacja w systemie Mac OS X, 560, 561
instalacja w systemie Windows, 561

phpMyAdmin, 92, 93, 94
POST, 552, 553
potokowe przesy.anie danych, 225, 226

.8czenie z szablonami, 258
obs.uga b.Hdów, 237
po stronie klienta, 234

powiadomienia, generowanie, 202

bezpo/rednie, 205, 206, 207
pasywne, 205, 207, 208
tre/T multimedialna, 204, 205

powi8zanie, 564
poziomy pewno/ci NIST, 481
Provider Authentication Policy Extension, 471, 479

metody uwierzytelniania, 480

przegl8daj8cy, 564
PubSubHubbub, 18, 278, 279, 440

dzia.anie, 441, 442, 443
zalety, 443, 444

PUT, 553, 554
putDataSet(), 235
Python

budowanie subskrybenta, 452, 454
budowanie wydawcy, 448
konfiguracja /rodowiska, 562
OAuth 1.0a, 363, 364, 365, 366, 368, 369
OAuth 2, 387, 388, 389, 390, 392

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

572

 

 Skorowidz

Python

OpenID, 497, 498, 499, 500, 501, 502, 503, 504,

505, 507

uwierzytelnianie hybrydowe, 533, 534, 535,

536, 537, 538, 539, 540, 542, 543, 545

wHze. Open Graph, 416, 418, 419

R

registerListener(), 236
relacje

bezpo/rednie, 60, 61
po/rednie, 61
z podmiotami, 71

rel-directory, 557
rel-enclosure, 557
rel-license, 557
rel-nofollow, 557
rel-tag, 557
removeTab(), 135
renderOption, opcja, 300
REST, 551, 564
rozproszone frameworki internetowe, 277, 564
RPC, 564

S

Salmon, 18, 279, 455

dzia.anie, 455, 456
implementacja, 459
ochrona przed spamem, 458

same-origin policy, Patrz zasada tego samego

pochodzenia

selektor atrybutów, 318, 319
selektor my/liwego, 317
selektor precyzyjnego wyboru, 318
selektor stanu, 319, 320
selektor w.a/ciwo/ci, 318
semantyka, 564
set(), 128
setSelectedTab(), 135
setTitle(), 129, 130
Shinding, 18, 79, 80, 565

instalacja w systemie Mac OS X, 81, 82, 83
instalacja w systemie Windows, 84, 85, 86
instalacja, testowanie, 86, 87
konfiguracja, 80
rozszerzanie o w.asne biblioteki JavaScript,

136, 137, 138

wy/wietlanie gad5etu, 144

sieT semantyczna, 556, 564
sieT spo.eczno/ciowa, 565

Simple Registration, 471, 472

pola, 472

SREG, Patrz Simple Registration
strumie: aktywno/ci, 200, 201

personalizacja aplikacji, 201
promocja aplikacji, 200
umieszczanie komunikatu, 202, 203

Subversion, 557, 558

instalacja w systemie Mac OS X, 558
instalacja w systemie Windows, 558

SVN, 557
swapTabs(), 135
szablony, 240, 241, 245, 246

biblioteki, 262, 263
.8czenie z potokowym przesy.aniem danych,

258

wy/wietlanie, 243, 244, 245

T

TabSet, obiekt, 134
tokeny, 340
Top, zmienna, 250
Twitter, 65, 66

OAuth, 348, 349

U

uprawnienia, 37, 38

dostHpu do danych, 393, 394
dostHpu do stron, 394
publikacji, 394

Url, obiekt, 189
UserPref, wHze., 97, 101, 102, 103
UserPrefs, obiekt, 239
us.ugi sieciowe, 549
uwierzytelnianie podstawowe, 337, 338, 339

wady, 339, 340

u5ytkownicy

lista wyboru, 271
odznaka, 272
podzia. na klastry, 62, 63
strumie: aktywno/ci, 200, 201
udostHpnianie prywatnych danych, 63, 64
uzyskiwanie profilu, 189, 191
wy/wietlanie nazwiska, 271
znajomi, 192

V

ViewerRequest, znacznik, 231, 232
ViewParams, obiekt, 239

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Skorowidz

 

573

W

WebFinger, 18, 429, 430

geneza, 429, 430
implementacja, 430, 432
wady, 432, 433

widoki aplikacji, 32

domowy, 33, 34
domy/lny, 36
du5y, 33
kanwy, 35, 36
ma.y, 32, 34
niedopracowanie, 42
profilu, 34, 35

w.a/ciciel, 565
wyra5enia, 247
wyra5enia warunkowe, 250, 251, 252

X

XFN, 557
xFolk, 557
XHTML Friends Network, 557
xoauth_public_key, 215
XOXO, 557
XRD, deskryptor, 436
XRDS, 565
XRI, 565
XSS, ataki, 30

Y

Yahoo!, 68, 69

OAuth, 348, 349, 350

YAML, 565
YAP, 565
YUI 2.8, biblioteka, 308, 309

Z

zabezpieczenia, 29, 31
zasada tego samego pochodzenia, 30, 550

omijanie wymaga:, 551

zmienne specjalne, 248

Context, 248
Cur, 249
My, 249, 250
Top, 250

znaczniki semantyczne, 556
zrównowa5one publikowanie powiadomie:, 209

F

58dania danych, rodzaje, 228
58danie bez nadzoru, 566

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Czytaj dalej...

574

 

 Skorowidz

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ