15

これが私が現在持っているものです:

  • 多くの API でユーザーの認証が必要な Spring REST サービス
  • 「登録」API (/api/v1/register)
  • ユーザー名/パスワードを取る「ログイン」API (/api/v1/login)
  • Spring Social および Spring Security に依存してユーザー接続を作成し、ユーザーをログインさせる「Facebook ログイン」API (/auth/facebook)

私の問題は、これらの API を複数のクライアントで使用したいということですが、現在の Facebook ログインでは、モバイルではうまく機能しません (Web サイトではうまく機能します)。

モバイル シナリオは次のとおりです。

  • Facebook の iOS SDK を使用して、ユーザーに許可を要求します
  • Facebook がユーザー アクセス トークンを返す
  • バックエンド サービスにこのトークンを送信し、Spring Social にそれを受け入れさせ、ユーザー接続などを作成したいと考えています。

これはできますか?それとも、ユーザー接続を維持するために独自の API を作成する必要がありますか?

どんな助けにも感謝します!

4

1 に答える 1

10

私はまったく同じ問題を抱えていました。これが私がそれを機能させる方法です。おそらく、次のような SocialConfigurer がどこかにあるでしょう。

@Configuration
@EnableSocial
public class SocialConfig implements SocialConfigurer {

    @Autowired
    private DataSource dataSource;

    @Bean
    public FacebookConnectionFactory facebookConnectionFactory() {
        FacebookConnectionFactory facebookConnectionFactory = new FacebookConnectionFactory("AppID", "AppSecret");
        facebookConnectionFactory.setScope("email");
        return facebookConnectionFactory;
    }

    @Override
    public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) {
        cfConfig.addConnectionFactory(facebookConnectionFactory());
    }

    @Override
    public UserIdSource getUserIdSource() {
        return new AuthenticationNameUserIdSource();
    }

    @Override
    public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
        return new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText());
    }

    // Other @Bean maybe ...
}

ここからできることは、Controller/RestController で、サーバーに送信するトークンの RequestParam を使用してマッピングを追加することです。

@Autowired
private FacebookConnectionFactory facebookConnectionFactory;

@Autowired
private UsersConnectionRepository usersConnectionRepository;

@RequestMapping(value = "/my-facebook-url", method = RequestMethod.POST)
public String fb(@RequestParam String token) {
    AccessGrant accessGrant = new AccessGrant(token);
    Connection<Facebook> connection = facebookConnectionFactory.createConnection(accessGrant);

    UserProfile userProfile = connection.fetchUserProfile();
    usersConnectionRepository.createConnectionRepository(userProfile.getEmail()).addConnection(connection);

    // ...

    return "Done";
}

参考文献

于 2015-09-28T17:31:40.630 に答える