>  기사  >  Java  >  Spring Social을 사용하여 소셜 네트워크에 연결하는 방법

Spring Social을 사용하여 소셜 네트워크에 연결하는 방법

怪我咯
怪我咯원래의
2017-06-23 14:18:032057검색

소셜 네트워크는 오늘날 사람들의 삶에 없어서는 안 될 부분이 되었습니다. Facebook, LinkedIn, Twitter, Sina Weibo와 같은 인기 소셜 네트워킹 사이트는 매우 높은 인기를 얻었으며 많은 사람들이 매일 방문해야 하는 사이트가 되었습니다. 소셜 네트워크에서는 많은 양의 정보가 공유됩니다. 애플리케이션의 경우 소셜 네트워크에 대한 지원을 제공해야 합니다. 앱은 소셜 네트워크와의 통합을 통해 빠르게 인기를 얻을 수 있습니다. 소셜 네트워크와의 통합에는 주로 두 가지 기능이 있습니다. 첫 번째는 비교적 간단한 사용자 로그인 통합으로, 사용자는 소셜 네트워크 웹사이트의 기존 계정을 사용하여 애플리케이션에 로그인할 수 있습니다. 이것의 장점은 사용자가 재등록하는 과정을 절약할 수 있고, 사용자의 기존 소셜 네트워크와 연결할 수도 있다는 것입니다. 두 번째는 사용자가 관련 콘텐츠를 공유할 수 있는 심층적인 통합 방법입니다. 소셜 네트워크 중간에 적용됩니다. 이것의 장점은 애플리케이션 자체를 홍보하면서도 사용자의 끈기를 유지할 수 있다는 점이다.

애플리케이션에 소셜 네트워크를 통합하는 것은 복잡한 작업이 아닙니다. 많은 소셜 네트워킹 서비스는 타사 애플리케이션을 통합할 수 있는 개방형 API를 제공합니다. 완료하려면 관련 문서를 참조하세요. 그러나 통합 자체에는 일정량의 작업이 필요합니다. 통합해야 하는 웹사이트가 많을수록 그에 따른 작업량도 늘어납니다. Spring 프레임워크 컴포넌트 제품군의 일부인 Spring Social은 소셜 네트워크 서비스의 추상화를 제공하고 운영을 위한 관련 API를 제공합니다.

Spring Social을 사용하는 가장 큰 이점은 이미 주류 소셜 네트워킹 사이트에 대한 지원을 제공하고 있으며 간단한 구성만 필요하다는 것입니다. 덜 일반적으로 사용되는 일부 소셜 네트워킹 사이트의 경우 커뮤니티에서 해당 구성 요소를 찾을 수도 있습니다. 이 기사에서는 샘플 애플리케이션을 사용하여 Spring Social의 사용법을 설명합니다.

샘플 애플리케이션

이 예제에서는 사용자가 소셜 네트워킹 사이트에 로그인하여 친구의 정보를 볼 수 있습니다. 이것은 Spring MVC 프레임워크를 사용하여 구축된 웹 애플리케이션입니다. 이 애플리케이션은 내장된 H2 데이터베이스를 사용하여 데이터를 저장합니다. 프론트엔드는 JSP, JSTL, Spring에서 제공하는 태그 라이브러리를 사용하고, 페이지 레이아웃은 Apache Tiles를 사용합니다. Spring Security를 ​​사용하여 사용자 인증을 관리합니다. 페이지의 스타일은 Twitter Bootstrap 라이브러리를 사용하여 지정됩니다. 프로젝트는 Gradle을 사용하여 빌드되었습니다. 프런트 엔드 라이브러리는 Bower를 통해 관리됩니다.

예제에서 제공하는 기능은 비교적 간단하며 주로 로그인 및 등록 페이지와 사용자 홈페이지를 포함합니다. 로그인 시 사용자는 제3자 소셜 네트워크 계정을 사용하도록 선택할 수 있습니다. 로그인 후, 소셜 네트워크의 친구 정보를 보실 수 있습니다.

기존 소셜 네트워크 계정을 사용하여 로그인

소셜 네트워크와 통합된 가장 기본적인 기능은 사용자가 기존 계정을 사용하여 로그인할 수 있도록 하는 것입니다. 사용자는 새로운 계정을 등록하는 것 외에도 다른 웹사이트의 기존 계정을 사용하여 로그인할 수도 있습니다. 이 방법을 종종 제3자 웹사이트에 연결한다고 합니다. 사용자의 경우 일반적인 시나리오는 등록 또는 로그인 페이지에서 연결할 타사 소셜 네트워크를 선택하는 것입니다. 그런 다음 로그인 및 승인을 위해 타사 웹사이트로 이동하세요. 위 단계를 완료하면 새 사용자가 생성됩니다. 연결 프로세스 중에 애플리케이션은 제3자 소셜 네트워킹 사이트에서 사용자 프로필 정보를 가져와 새 사용자 생성을 완료할 수 있습니다. 새로운 사용자가 생성되면 해당 사용자는 다음 번에 제3자 소셜 네트워크의 계정을 사용하여 직접 로그인할 수 있습니다.

기본 구성

Spring Social은 타사 웹사이트 사용자 로그인 및 등록을 처리하는 Spring MVC 컨트롤러(Controller) 구현을 제공하며 소셜 네트워크 계정을 사용하여 로그인 및 등록 기능을 자동으로 완료할 수 있습니다. 이러한 컨트롤러를 사용하기 전에 몇 가지 기본 구성이 필요합니다. Spring Social의 구성은 org.springframework.social.config.annotation.SocialConfigurer 인터페이스를 구현하여 완료됩니다. SocialConfigurer 인터페이스를 구현하는 SocialConfig 클래스의 일부가 제공됩니다. "@EnableSocial" 주석은 Spring Social 관련 기능을 활성화하는 데 사용됩니다. "@Configuration" 주석은 이 클래스에 Spring 프레임워크와 관련된 구성 정보도 포함되어 있음을 나타냅니다. SocialConfigurer 인터페이스에는 구현해야 할 세 가지 메서드가 있습니다.

addConnectionFactories: 이 콜백 메서드는 애플리케이션이 지원해야 하는 소셜 네트워크에 해당하는 연결 팩토리 구현을 추가할 수 있도록 하는 데 사용됩니다.

getUserIdSource: 이 콜백 메소드는 현재 사용자를 고유하게 식별하는 데 사용되는 org.springframework.social.UserIdSource 인터페이스의 구현 객체를 반환합니다.

getUsersConnectionRepository: 이 콜백 메소드는 사용자와 소셜 네트워크 서비스 제공자 간의 통신을 관리하는 데 사용되는 org.springframework.social.connect.UsersConnectionRepository 인터페이스의 구현 객체를 반환합니다.

특히 샘플 애플리케이션의 경우 org.springframework.social.linkedin.connect.LinkedInConnectionFactory 클래스로 표시되는 LinkedIn 연결 팩토리 구현이 addConnectionFactories 메소드 구현에 추가됩니다. getUserIdSource 메소드 구현에서는 현재 로그인된 사용자의 정보를 얻기 위해 Spring Security를 ​​사용합니다. getUsersConnectionRepository 메소드는 데이터베이스 기반 JdbcUsersConnectionRepository 클래스의 구현 객체를 생성합니다. LinkedInConnectionFactory 클래스는 Spring Social의 기능을 반영하는 방식으로 생성됩니다. LinkedIn에서 제공하는 기능을 바로 사용하시려면 LinkedIn에서 적용한 API Key만 입력하시면 됩니다. OAuth와 관련된 세부사항은 Spring Social에 의해 캡슐화됩니다.

1. Spring Social 기본 구성 사용

@Configuration@EnableSocialpublic class SocialConfig implements SocialConfigurer { @Inject
 private DataSource dataSource; @Override
 public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) {
 cfConfig.addConnectionFactory(new LinkedInConnectionFactory(env.getProperty("linkedin.consumerKey"), env.getProperty("linkedin.consumerSecret")));
 } @Override
 public UserIdSource getUserIdSource() { return new UserIdSource() { @Override
 public String getUserId() {
 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null) { throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in");
 } return authentication.getName();
 }
 };
 } @Override
 public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { return new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText());
 }
}

Login Controller

Spring Social 구성 후 다음 단계는 사용자 등록 및 로그인을 처리하는 해당 Spring MVC 컨트롤러를 생성하는 것입니다. Spring Social은 이미 해당 컨트롤러 구현을 제공하므로 요청을 수행하기 위한 인터페이스만 생성하면 됩니다. 가장 먼저 만들어야 할 것은 타사 소셜 네트워크를 통해 로그인하기 위한 컨트롤러입니다. 표시된 대로 필요한 컨트롤러를 생성하려면 Spring Bean만 생성하면 됩니다. 이 컨트롤러는 기본적으로 "/signin" URL에 바인딩되어 있습니다. 각 제3자 서비스 제공업체에는 LinkedIn의 식별자 "linkedin"과 같은 해당 식별자가 있습니다. 서비스 제공업체의 식별자는 다양한 컨트롤러의 URL에 포함되는 경우가 많습니다. 예를 들어 사용자가 LinkedIn 계정을 통해 로그인해야 하는 경우 해당 URL은 "/signin/linkedin"입니다. Twitter 계정을 통해 로그인하는 경우 해당 URL은 "/signin/twitter"입니다.

2. 타사 소셜 네트워크를 통한 로그인을 위한 컨트롤러

@Beanpublic ProviderSignInController providerSignInController(ConnectionFactoryLocator connectionFactoryLocator, UsersConnectionRepository usersConnectionRepository) { return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new SimpleSignInAdapter(new HttpSessionRequestCache()));
}

위에서 SimpleSignInAdapter 클래스는 ProviderSignInController 클래스의 로그인 로직으로 작동하는 org.springframework.social.connect.web.SignInAdapter 인터페이스를 구현합니다. 애플리케이션 자체가 사이를 연결합니다. 사용자가 타사 웹 사이트에 대한 로그인을 완료하면 사용자는 SignInAdapter 인터페이스를 통해 자동으로 애플리케이션에 로그인됩니다. SimpleSignInAdapter 클래스의 구현은 아래와 같습니다.

3. SimpleSignInAdapter 클래스 구현

public class SimpleSignInAdapter implements SignInAdapter { private final RequestCache requestCache; @Inject
 public SimpleSignInAdapter(RequestCache requestCache) { this.requestCache = requestCache;
 } @Override
 public String signIn(String localUserId, Connection<?> connection, NativeWebRequest request) {
 SignInUtils.signin(localUserId); return extractOriginalUrl(request);
 } private String extractOriginalUrl(NativeWebRequest request) {
 HttpServletRequest nativeReq = request.getNativeRequest(HttpServletRequest.class);
 HttpServletResponse nativeRes = request.getNativeResponse(HttpServletResponse.class);
 SavedRequest saved = requestCache.getRequest(nativeReq, nativeRes); if (saved == null) { return null;
 }
 requestCache.removeRequest(nativeReq, nativeRes);
 removeAutheticationAttributes(nativeReq.getSession(false)); return saved.getRedirectUrl();
 } private void removeAutheticationAttributes(HttpSession session) { if (session == null) { return;
 }
 session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
 }
}

코드 목록 3에서 SimpleSignInAdapter 클래스의 signIn 메서드는 로그인을 위해 SignInUtils 클래스의 signin 메서드를 호출합니다. 해당 구현은 코드 목록 4를 참조하세요. signIn 메소드의 반환 값은 로그인 성공 후의 점프 URL입니다.

4. SignInUtils 클래스의 signIn 메서드 구현

public class SignInUtils { public static void signin(String userId) {
 SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(userId, null, null));
 }
}

프런트 엔드 페이지

LinkedIn을 통해 로그인 프로세스를 시작하려면 페이지를 통해 로그인 컨트롤러의 URL에 POST 요청만 실행하면 됩니다. 그림과 같이 양식을 제출하면 로그인 프로세스가 시작됩니다. 사용자는 먼저 LinkedIn 웹사이트의 승인 페이지로 이동하여 신청서를 승인한 후 등록할 수 있습니다.

5. 로그인 페이지

<form id="linkedin-signin-form" action="signin/linkedin" method="POST" class="form-signin" role="form">
 <h2 class="form-signin-heading">Or Connect by</h2>
 <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
 <button type="submit" class="btn btn-primary">LinkedIn</button>
</form>

기본적으로 제3자 웹사이트 인증이 완료되면 사용자는 "/signup" URL에 해당하는 페이지로 이동하게 됩니다. 이 페이지에서 사용자는 관련 등록 정보를 추가할 수 있습니다. 동시에 사용자 이름 등 제3자 웹사이트에서 얻은 사용자 프로필 정보가 미리 입력될 수 있습니다. 양식이 제출된 후 이 페이지의 작업은 표시된 컨트롤러에 의해 처리됩니다.

6. 사용자 등록 컨트롤러 구현

@RequestMapping(value="/signup", method=RequestMethod.POST)
public String signup(@Valid @ModelAttribute("signup") SignupForm form, BindingResult formBinding, WebRequest request) { if (formBinding.hasErrors()) { return null;
 }
 Account account = createAccount(form, formBinding); if (account != null) {
 SignInUtils.signin(account.getUsername());
 ProviderSignInUtils.handlePostSignUp(account.getUsername(), request); return "redirect:/";
 } return null;
}

사용자가 등록 양식을 제출한 후, 사용자가 입력한 정보를 기반으로 해당 계정을 생성한 다음 새로 등록된 계정으로 로그인하고 홈페이지로 돌아갑니다.

API 사용

Spring Social 的另外一个重要的作用在于提供了很多社交网络服务的 API 的封装。当用户通过社交网络的账号登录之后,可以通过相应的 API 获取到相关的信息,或执行一些操作。比如获取到用户的好友信息,或是根据用户的要求发布新的消息。一般来说,很多社交网络服务提供商都有自己的 API 来提供给开发人员使用。不过一般只提供 REST API,并没有 Java 封装。Spring Social 的一个目标是为主流的社交网络提供相应的 Java 封装的 API。对于社区已经有良好的 Java 库的社交网络,如 Twitter,Spring Social 会进行整合与封装;而对于暂时没有 Java 实现的,Spring Social 的组件会提供相应的支持。如示例应用中使用的 LinkedIn 的 Java API 是由 Spring Social 开发的。

在使用 LinkedIn 的 Java API 之前,首先要创建相应的 Spring Bean,如所示。

 7. 创建 LinkedIn API 对应的 Bean

@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public LinkedIn linkedin(ConnectionRepository repository) {
 Connection<LinkedIn> connection = repository.findPrimaryConnection(LinkedIn.class); return connection != null ? connection.getApi() : null;
}

LinkedIn Java API 的核心接口是 org.springframework.social.linkedin.api.LinkedIn。如果当前用户已经连接了 LinkedIn 的账号,就可以通过 ConnectionRepository 接口找到该用户对应的连接的信息,并创建出 API 接口的实现。是展示 LinkedIn 上好友信息的控制器的实现。

8. 展示 LinkedIn 上好友信息的控制器的实现

@Controllerpublic class LinkedInConnectionsController { private LinkedIn linkedIn; @Inject
 public LinkedInConnectionsController(LinkedIn linkedIn) { this.linkedIn = linkedIn;
 } @RequestMapping(value="/connections", method= RequestMethod.GET) public String connections(Model model) {
 model.addAttribute("connections", linkedIn.connectionOperations().getConnections()); return "connections";
 }
}

通过 LinkedIn 接口的 connectionOperations 方法可以获取到 org.springframework.social.linkedin.api.ConnectionOperations 接口的实现,然后就可以再通过 getConnections 方法获取到包含好友信息的 org.springframework.social.linkedin.api.LinkedInProfile 类的对象列表。然后就可以在网页上展示,如所示。

9. 展示 LinkedIn 好友信息的页面

<ul class="media-list">
 <c:forEach items="${connections}" var="connection">
 <li class="media">
 <a href="" class="pull-left">
 <img class="lazy-load" data-original="${connection.profilePictureUrl}" alt="" class="media-object">
 </a>
 <div class="media-body">
 <h4 class="media-heading">${connection.firstName} ${connection.lastName}</h4>
 <p><c:out value="${connection.headline}" /></p>
 </div>
 </li>
 </c:forEach>
</ul>

结束语

在社交网络日益流行的今天,Web 应用都应该考虑增加对社交网络的支持。这样既方便了用户,让他们省去了重新注册的麻烦,又可以增加用户粘性,同时可以通过社交网络进行推广。虽然很多社交网站都提供了开放 API 来让应用使用其服务,但是集成所需的工作量是不小的。Spring Social 作为 Spring 框架中的一部分,为在 Web 应用中集成社交网络提供了良好支持。本文详细介绍了如何通过 Spring Social 来实现通过社交网络账号进行登录以及使用社交网络提供的 API。

위 내용은 Spring Social을 사용하여 소셜 네트워크에 연결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:자바 학습 경로다음 기사:자바 학습 경로