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