рд╡рд╕рдВрдд-рд╕рд╛рдорд╛рдЬрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлреЗрд╕рдмреБрдХ, рд▓рд┐рдВрдХреНрдбрдЗрди рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд╕реНрдерд┐рддрд┐ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ

рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВрдиреЗ рдирдП рд╕реНрдкреНрд░рд┐рдВрдЧрд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ : рд╡рд╕рдВрдд-рд╕рд╛рдорд╛рдЬрд┐рдХ ред рдЖрдЬ рдореИрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдпрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдирд╛) рдХреИрд╕реЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╕рднреА рддреАрди рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдФрд░ рддреАрдиреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдзреНрдпрд╛рди рд╕реЗ - рдХрдЯ рдХреЗ рддрд╣рдд рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдХреНрд╖рд░ рдФрд░ рдХреЛрдб рд╣реИрдВ рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЪрд┐рддреНрд░ рдирд╣реАрдВ рд╣реИрдВ)ред

рдЫрд╡рд┐рдЫрд╡рд┐рдЫрд╡рд┐рдЫрд╡рд┐



рд╕реНрдерд┐рддрд┐ рдЕрджреНрдпрддрди рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐:

* рдпрд╣ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ;

* рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдВрдХреНрдбрдЗрди рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ-рд╕реЛрд╢рд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреАрдЖрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ-рд╕реЛрд╢рд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд╕реНрдерд╛рди рдкрд░, рдХреЛрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред



рд╕реНрд╡рдпрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдЧреНрд░реАрдирд╣рд╛рдЙрд╕ рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВ - рд▓реЗрдХрд┐рди рдЖрд╡реЗрджрди рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ рдФрд░ "рд╕рд╛рдорд╛рдЬрд┐рдХ" рднрд╛рдЧ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ - рд▓реЗрдХрд┐рди "рдкреВрд░реА рддрд╕реНрд╡реАрд░" рджрд┐рдП рдмрд┐рдирд╛ - рдЖрджрд┐рдоред рдЗрд╕реАрд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ (рдЕрдкрдиреЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП) рдЬреЛ рдПрдХ рддрд░рдл рд╕реНрдерд┐рддрд┐ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рди рд╕реЗ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛, рдФрд░ рджреВрд╕рд░реА рддрд░рдл рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд░рд▓ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП - рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдХрд┐ html рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╢реИрд▓реА рдХреЗ рдирдЧреНрди рд╣реИ - рдкреНрд▓рд╕ рдЬрд╛рд╡рд╛ рдХреЛрдб рд╣рдореЗрд╢рд╛ "рд╕реБрдВрджрд░" рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреЛрдб рдХреЛ "рдЕрдзрд┐рдХ рд╕рд╣реА" рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд░рд╛рд╕рдд рджреНрд╡рд╛рд░рд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрджрд╛рд╣рд░рдг "рдзреЛрдпрд╛" рд╣реЛрдЧрд╛ - рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдоред



рдпрд╣ рдкреЛрд╕реНрдЯ рдореЗрд░реА рдЕрдВрдЧреНрд░реЗрдЬреА рдкреЛрд╕реНрдЯ рдХрд╛ рдПрдХ рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рдж рд╣реИред

рд╕рднреА рд╕реНрд░реЛрдд svn рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: http://svn.emforge.net/svnroot/akakunin-experiments/update-status

рд╕реНрд░реЛрддреЛрдВ рдХреЛ EmForge рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рднреА рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред



рдЖрдзрд╛рд░ рдЖрд╡реЗрджрди



рдПрдХ "рдЖрдзрд╛рд░" рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рд╡рд╕рдВрдд рдврд╛рдВрдЪреЗ рдФрд░ рд╡рд╕рдВрдд-рдПрдорд╡реАрд╕реА рдкрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд╛рдирдХ рд╕рдЬреНрдЬрди рдХреЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

* рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд╡реЗрди;

* рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ 3.0.5;

* рд╡рд╕рдВрдд-рд╕реБрд░рдХреНрд╖рд╛ 3.0.5;

* рдЬреЗрдкреАрдП (рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ);

* рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ HSQLред



рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдпрдерд╛рд╕рдВрднрд╡ рдорд╛рдирдХ рдФрд░ рд╕рд░рд▓ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЗрдХрд╛рдИ рд╣реИ - net.emforge.updatestatus.entity.User - рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдкрд╛рд╕рд╡рд░реНрдб) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдЯреЛрдХрди рднреА рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ DAO рд╡рд░реНрдЧ UserDao , рдФрд░ UserServiceImpl рд╕реЗрд╡рд╛ рд╣реИред

рдЖрд╡реЗрджрди рдореЗрдВ рджреЛ рдкреГрд╖реНрда рд╣реИрдВ - рдореБрдЦреНрдп рдПрдХ (рд╕реВрдЪрдХрд╛рдВрдХ) рд▓реЙрдЧрд┐рди рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдлрд╛рд░реНрдо ( UserController рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд), рдФрд░ рд╕реНрдерд┐рддрд┐ рдкреГрд╖реНрда рдХреЗрд╡рд▓ рд▓реЙрдЧ-рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ - рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред



рд╕рд╛рде рдореЗрдВ, рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрдВрдЬреАрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реНрдерд┐рддрд┐ рдкреГрд╖реНрда рдкрд░ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рдХрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред



рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХрд░рдг



рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдЙрди рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:

* рдлреЗрд╕рдмреБрдХ рдкрд░ рдкрдВрдЬреАрдХрд░рдг http://developers.facebook.com/setup/ рдкреЗрдЬ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреГрдкрдпрд╛ рд╕рд╛рдЗрдЯрд╣реЛрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: 8080 / рдЕрдкрдбреЗрдЯ-рд╕реНрдЯреЗрдЯрд╕ / - рдЕрдиреНрдпрдерд╛ рдХреЙрд▓рдмреИрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛;

* рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ: http://dev.twitter.com/apps/new ;

* рд▓рд┐рдВрдХреНрдбрдЗрди рд╕реЗ рдЬреБрдбрд╝реЗрдВ: https://www.linkedin.com/secure/developer



рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рджреЛ рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреА - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдВрдЬреА (рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдИрдбреА) рдФрд░ рд╕реБрд░рдХреНрд╖рд╛-рдЯреЛрдХрди - рдЙрдиреНрд╣реЗрдВ src / main / resource / config.properties рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП



рддреЗрдЬ рджреМрдбрд╝реЛ



рдпрджрд┐ рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрд╛рд╡рд╛ рдФрд░ рдорд╛рд╡реЗрди рд╣реИ (рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдРрд╕рд╛ рд╣реИ :)) - рддреЛ рдмрд╕ svn рд╕реЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд▓реЗрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (config.properties рдореЗрдВ рдЕрдкрдиреА рдЪрд╛рдмрд┐рдпрд╛рдБ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж)

mvn tomcat:run







рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЖрд╡реЗрджрди http: // localhost: 8080 / update-status рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдВ - рдФрд░ рдЬрд╛рдПрдВ, рдФрд░ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ



рд▓рд┐рдВрдХреНрдбрдЗрди рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рдХрдиреЗрдХреНрдЯ



OAuth рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛрдиреЛрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рди рд╣реИ - рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдЯреНрд╡рд┐рдЯрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред

рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд░реНрдЧ TwitterProvider рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ getOAuthService рд╣реИ:

public OAuthService getOAuthService() {

OAuthConfig config = new OAuthConfig();

config.setRequestTokenEndpoint( "https://api.twitter.com/oauth/request_token" );

config.setAccessTokenEndpoint( "https://api.twitter.com/oauth/access_token" );

config.setAccessTokenVerb(Verb.POST);

config.setRequestTokenVerb(Verb.POST);

config.setApiKey(apiKey);

config.setApiSecret(apiSecret);

config.setCallback(callbackUrl);



return new OAuth10aServiceImpl(

new HMACSha1SignatureService(),

new TimestampServiceImpl(),

new BaseStringExtractorImpl(),

new HeaderExtractorImpl(),

new TokenExtractorImpl(),

new TokenExtractorImpl(),

config);

}








apiKey, apiSecret & callbackUrl рдХреЛ config.properties (рдЬрд╣рд╛рдВ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ) рд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рд▓рд┐рдВрдХ / рдХрдиреЗрдХреНрдЯрд░ / рдЯреНрд╡рд┐рдЯрд░ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╣реИрдВрдбрд▓рд░ ( рд╕реЛрд╢рд▓рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ ) рд▓рдЯрдХрд╛рдПрдВ :

@RequestMapping(value = "/connect/twitter" , method = RequestMethod.GET)

public String requestConnectionToTwitter(WebRequest request) {

// get request token

Token requestToken = twitterProvider.getOAuthService().getRequestToken();

// store request token in session

request.setAttribute( "twitter_request_token" , requestToken, WebRequest.SCOPE_SESSION);



return "redirect:" + twitterProvider.getAuthorizeUrl() + "?oauth_token=" + requestToken.getToken();

}










рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╣реИрдВрдбрд▓рд░ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд▓реЙрдЧ рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╕рдлрд▓ рд▓реЙрдЧрд┐рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯреНрд╡рд┐рдЯрд░ рдХреЙрд▓рдмреИрдХ рдпреВрдЖрд░рдПрд▓ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЪрд╛рдмрд┐рдпрд╛рдБ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред рд╣рдо SocialController рдореЗрдВ рдПрдХ рдХреЙрд▓рдмреИрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВрдЧреЗ:

/** Callback from twitter on success login

*

* @param verifier

* @param request

* @return

*/

@RequestMapping(value = "/callback/twitter" , method = RequestMethod.GET, params = "oauth_token" )

public String authorizeTwitterCallback(@RequestParam(value = "oauth_verifier" , defaultValue = "verifier" ) String verifier,

WebRequest request) {

// get request token from session

Token requestToken = (Token)request.getAttribute( "twitter_request_token" , WebRequest.SCOPE_SESSION);



// get access token

Token accessToken = twitterProvider.getOAuthService().getAccessToken(requestToken, new Verifier(verifier));

String userName = getCurrentUser().getName();

userService.updateTwitterAuthentication(userName, accessToken.getToken(), accessToken.getSecret());



return "redirect:/status" ;



}







рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред



рдлреЗрд╕рдмреБрдХ рдХрдиреЗрдХреНрдЯ



рд╕рдм рдХреБрдЫ рдлреЗрд╕рдмреБрдХ рдкрд░ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рд╣реИред рдлреЗрд╕рдмреБрдХ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╕реНрдЯреЗрдЯрд╕ рдкрд░ "Facebook рд╕реЗ рдХрдиреЗрдХреНрдЯ" рдмрдЯрди рд░рдЦреЗрдВ ред рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреГрд╖реНрда:

< form id ="fb_signin" action ="<c:url value=" / connect / facebook " /> " method="post" >

< div class ="formInfo" >

</ div >

< div id ="fb-root" ></ div >

< p >< fb:login-button perms ="email,publish_stream,offline_access" onlogin ="$('#fb_signin').submit();" v ="2" length ="long" > Connect to Facebook </ fb:login-button ></ p >

</ form >



< facebook:init />








рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:

* facebook: init рдЯреИрдЧ рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ-рд╕реЛрд╢рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдореЗрдВ $ {facebookProvider} рдмрд┐рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╣рдордиреЗ рдЗрд╕реЗ FacebookProvider рд╡рд░реНрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯреИрдЧ рдЗрд╕ рдмреАрди рд╕реЗ рдХреЗрд╡рд▓ рдЪрд╛рдмрд┐рдпрд╛рдБ рд▓реЗрддрд╛ рд╣реИ;

* fb: рд▓реЙрдЧрд┐рди-рдмрдЯрди рдлреЗрд╕рдмреБрдХ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдмрдЯрди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ;

* рдлреЙрд░реНрдо-рдПрдХреНрд╢рди / рдХрдиреЗрдХреНрдЯ / рдлреЗрд╕рдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдлрд▓ рд▓реЙрдЧрд┐рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ tagLib рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

<%@ taglib uri="http://www.springframework.org/spring-social/facebook/tags" prefix="facebook" %>







рдФрд░ jQuery рдореЗрдВ рдкреНрд▓рдЧ - рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрднреА рдХрд┐рдпрд╛











рдареАрдХ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдХреЙрд▓рдмреИрдХ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ / рдХрдиреЗрдХреНрдЯ / рдлреЗрд╕рдмреБрдХ рдкрд░ рдЖрддрд╛ рд╣реИ:

@RequestMapping(value= "/connect/facebook" , method=RequestMethod.POST)

public String connectAccountToFacebook(@FacebookAccessToken String accessToken,

@FacebookUserId String facebookUserId) {

if (facebookUserId != null && accessToken != null ) {

// store facebook information

String userName = getCurrentUser().getName();

userService.updateFacebookAuthentication(userName, accessToken, facebookUserId);

}

return "redirect:/status" ;

}



* This source code was highlighted with Source Code Highlighter .








рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рджреЛ рджрд┐рд▓рдЪрд╕реНрдк рдПрдиреЛрдЯреЗрд╢рди рджреЗрдЦреЗрдВрдЧреЗ: @FacebookAccessToken рдФрд░ @FacebookUserId, рд╡рд╕рдВрдд-рд╕рд╛рдорд╛рдЬрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ WebArgololver рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ApplicationContext.xml рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

< bean id ="facebookWebArgResolver" class ="org.springframework.social.facebook.FacebookWebArgumentResolver" >

< constructor-arg name ="apiKey" value ="${facebook.appId}" />

</ bean >



* This source code was highlighted with Source Code Highlighter .






рдХреЙрд▓рдмреИрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг Tiwtter & Linkedin рдХреЗ рд╕рдорд╛рди рд╣реИ - рд╣рдо рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ facebookUserId рдФрд░ facebookToken) рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред



рдЯреНрд╡рд┐рдЯрд░ рдФрд░ рдлреЗрд╕рдмреБрдХ рдкрд░ рд╢реЗрдпрд░ рд╕реНрдерд┐рддрд┐



рдХрдиреЗрдХреНрдЯреЗрдб, рдХрдиреЗрдХреНрдЯреЗрдб, рдЕрдм рдЖрдк рд╕реНрдЯреЗрдЯрд╕ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдерд┐рддрд┐ рдкреГрд╖реНрда рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ textArea рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╛рда рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рдлрд╝реЙрд░реНрдо рд╣реИрдВрдбрд▓рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

@RequestMapping(value = "/status" , method = RequestMethod.POST)

public String sendStatus(@Valid StatusForm statusForm, BindingResult result, ModelMap modelMap) {

User user = getCurrentUser();



LinkedInTemplateExt linkedInTemplate = linkedInProvider.createTemplate(user);

FacebookTemplate facebookTemplate = facebookProvider.createTemplate(user);

TwitterTemplate twitterTemplate = twitterProvider.createTemplate(user);



// send message to LinkedIn

if (linkedInTemplate != null ) {

linkedInTemplate.updateStatus(statusForm.getStatus());

}



// send message to Facebook

if (facebookTemplate != null ) {

facebookTemplate.updateStatus(statusForm.getStatus());

}



// send message to Twitter

if (twitterTemplate != null ) {

twitterTemplate.updateStatus(statusForm.getStatus());

}

return "redirect:/status" ;

}



* This source code was highlighted with Source Code Highlighter .






рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ FacebookTemplate рдФрд░ TwitterTemplate (рд╕реНрдкреНрд░рд┐рдВрдЧ-рд╕реЛрд╢рд▓ рд╕реЗ рджреЛрдиреЛрдВ рд╡рд░реНрдЧ) рдорд┐рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдЕрдкрдбреЗрдЯрд╕реНрдЯреИрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ



рд▓рд┐рдВрдХреНрдбрдЗрди рд╕реНрдЯреЗрдЯрд╕ рд╕рдмрдорд┐рд╢рди



рд▓рд┐рдВрдХреНрдбрдЗрди рдирд┐рдХрд▓рд╛ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ - рд▓рд┐рдВрдХреНрдбрдЗрдирдЯреЗрдореНрдкрд▓реЗрдЯ, рдЬрд┐рд╕реЗ рд╡рд╕рдВрдд-рд╕рд╛рдорд╛рдЬрд┐рдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ - рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ (REST API call api.linkediv.com/v1/people/~/person рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) -рд╕рдХреНрд░рд┐рдпрддрд╛ )ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд░реНрдЧ LinkedInTemplateExt рд▓рд┐рдЦрддреЗ рд╣реИрдВ - "рдореВрд▓" рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА LinkedInTemplate рдЬрд┐рд╕рдореЗрдВ:

* рд╣рдо RestOperations рд╡рд░реНрдЧ рдХреА рдЕрдкрдиреА рд╡рд╕реНрддреБ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ "рд╕рд╣реА" рдХреЙрд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ (рдПрдХ рдФрд░ рд╡рд╕рдВрдд-рд╕рд╛рдорд╛рдЬрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛) рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ OAuth1RequestSignerFactory.getRequestSigner рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ;

* рд╣рдо рдЕрдкрдбреЗрдЯрд╕реНрдЯреИрдЯрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

public void updateStatus(String message) {

LinkedInPersonActivity personActivity = new LinkedInPersonActivity(message);



restOperationsExt.postForLocation( "http://api.linkedin.com/v1/people/~/person-activities" , personActivity);

}



* This source code was highlighted with Source Code Highlighter .








рд╣рдореЗрдВ рд▓рд┐рдВрдХреНрдбрдЗрдирдкрд░реНрд╕рдирдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреНрд▓рд╛рд╕ - рд╕реНрдЯреЗрдЯрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:

@XmlRootElement(name = "activity" )

public class LinkedInPersonActivity {

public LinkedInPersonActivity() {

}

public LinkedInPersonActivity(String body) {

this .body = body;

}



@XmlElement(name = "content-type" )

String contentType = "linkedin-html" ;



@XmlElement(name = "body" )

String body;

}



* This source code was highlighted with Source Code Highlighter .








рд╕рдм рдХреБрдЫ - рд╡рд┐рдзрд┐ рддреИрдпрд╛рд░ рд╣реИ - рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ LinkedInTemplate рд╢реБрд░реВ рдореЗрдВ рдПрдкреАрдЖрдИ рд╕реЗ рдмрд╣реБрдд рдХрдо рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рдирд╣реАрдВ рд╣реИред



рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧреА рд╣реИред



All Articles