当前位置: 动力学知识库 > 问答 > 编程问答 >

oauth - What's wrong with my spring-social ConnectController?

问题描述:

I'm trying to make a Spring Boot app that will connect to Fitbit's api using spring-social. I've (half-way) implemented a ConnectionFactory and it's dependencies for Fitbit, and am trying to consume it from my app. Part of this involves starting up a ConnectController to handle the OAuth2 "dance".

When I try to hit the ConnectController through my browser at http://localhost:8080/connect or http://localhost:8080/connect/fitbit I get redirected to the whitelable error page with the message:

There was an unexpected error (type=Method Not Allowed, status=405).

Request method 'GET' not supported

I don't really understand what I'm seeing, but when I set DEBUG level logging and use some breakpoints it looks like hitting /connect from the browser results in Spring trying to find something called connect/status and hitting /connect/fitbit result in spring trying to find something named /connect/fitbitConnect and then trying to internally make a GET request to /connect/connect/fitbitConnect.

In both cases it looks like the methods on ConnectController corresponding to /connect and /connect/{providerId} get called fine, and then Spring bombs when it goes looking for all that other stuff.

Here is the SocialConfigurer implementation I'm using which creates the ConnectController bean:

@Configuration

@EnableSocial

@PropertySource("${properties.path}/fitbot-service.properties")

public class SpringSocialConfig implements SocialConfigurer{

@Override

public void addConnectionFactories(ConnectionFactoryConfigurer connectionFactoryConfigurer, Environment environment) {

connectionFactoryConfigurer.addConnectionFactory(new FitbitConnectionFactory(

environment.getProperty("fitbit.clientId"),

environment.getProperty("fitbit.clientSecret")

));

}

@Override

public UserIdSource getUserIdSource() {

return new SessionUserIdSource();

}

@Override

public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {

return new InMemoryUsersConnectionRepository(connectionFactoryLocator);

}

@Bean

public ConnectController connectController(ConnectionFactoryLocator connectionFactoryLocator, ConnectionRepository connectionRepository) {

return new ConnectController(connectionFactoryLocator, connectionRepository);

}

}

What on earth is going on here? What am I doing wrong?

网友答案:

I believe this to be related to your question regarding GET vs. POST in ConnectController, so you may have already answered this for yourself. Nonetheless, let me clarify why it's looking for connect/status and connect/fitbitConnect.

Those are view names. When you do a GET for /connect, you're asking ConnectController to fetch connection status for all providers and to place it in the model, after which it will forward that model to a view whose logical name is "connect/status". Usually this is a JSP at the path "/connect/status.jsp" or maybe a Thymeleaf template at "/connect/status.html", but it can be any view following the rules of whatever Spring MVC view resolvers are in play.

Likewise, a GET request for /connect/fitbit is asking ConnectController to fetch connection status for the "fitbit" provider and to place that information in the model and forward it on to a view whose name is "/connect/fitbitConnect" (if there isn't a connection) or "/connect/fitbitConnected" (if there is a connection).

Aside from answering your question, may I also request that you tell me more about your FitBit Spring Social provider project? Is it modeled after other community-led Spring Social projects? In other words, is it a standalone extension to Spring Social that others may use? If so, tell me where it is in GitHub and I'll be happy to add it to the "Community Projects" section at http://projects.spring.io/spring-social/.

分享给朋友:
您可能感兴趣的文章:
随机阅读: