5

サーバーは、モバイル アプリから1 回限りの認証コードを受け取ります。これをスプリング ソーシャル アクセス トークンとリフレッシュ トークンに変換し、後で使用できるようにサーバー DB に保存する必要があります。

私の現在のコード:

String oneTimeAuthorizationCode= "xxx"; // provided by mobile client

ConnectionData cd = new ConnectionData("google", null, null, null, null, oneTimeAuthorizationCode, null, null, null);
GoogleConnectionFactory googleConnectionFactory = (GoogleConnectionFactory) connectionFactoryLocator.getConnectionFactory("google");
Connection<Google> connection = googleConnectionFactory.createConnection(cd);

// get the google API and work with it
Google  google = (Google) connection.getApi();

ConnectionData はワンタイム認証コードではなくアクセス トークンを想定しているため、oneTimeAuthorizationCode は間違っています。spring-social-google でワンタイム コードをアクセス トークンとリフレッシュ トークンに交換する方法はありますか?

4

3 に答える 3

2

アクセストークンの認可コードを交換するためのコードです

String authorizationcode=*****;
auth2Operations = googleConnectionFactory.getOAuthOperations();
AccessGrant accessGrant =auth2Operations.exchangeForAccess(authorizationcode,"Your      redirect uri",null);
connection = googleConnectionFactory.createConnection(accessGrant);
Google google=connection.getApi();
于 2014-11-07T07:23:35.190 に答える
0

これを行うには、Google のオフライン アクセスをリクエストする必要があります。ほとんどの変更は、クエリ パラメータ 'access_type=offline' を追加するだけですが、その oneTimeAuthorizationCode を取得しました。その後、承認後に更新トークンが返されます。

私自身のプロジェクトでは、REST 経由で渡すことができないため、ProviderSignInController をカスタマイズしてクエリ パラメータを手動で追加することになりました。

@RequestMapping(value="/{providerId}", method=RequestMethod.POST)
public RedirectView signIn(@PathVariable String providerId, NativeWebRequest request) {
    ConnectionFactory<?> connectionFactory = connectionFactoryLocator.getConnectionFactory(providerId);
    MultiValueMap<String, String> parameters = new LinkedMultiValueMap<String, String>(); 
    preSignIn(connectionFactory, parameters, request);

    // Request offline access for Google+. Will allow a refreshToken
    parameters.put("access_type", Arrays.asList("offline"));

    try {
        return new RedirectView(connectSupport.buildOAuthUrl(connectionFactory, request, parameters));
    } catch (Exception e) {
        logger.error("Exception while building authorization URL: ", e);
        return redirect(URIBuilder.fromUri(signInUrl).queryParam("error", "provider").build().toString());
    }
}
于 2014-11-16T18:01:57.783 に答える
0

ソリューション:

        GoogleConnectionFactory connectionFactory = new GoogleConnectionFactory("clientId","clientSecret");

        OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations();

        MultiValueMap<String, String> parameters = new LinkedMultiValueMap<String, String>();

        parameters.put("grant_type", Arrays.asList("authorization_code"));

        //"authCodeFromAndroid" to be replaced by the authCode sent from Android, and exactly returned from the method "getServerAuthCode()"
        AccessGrant accessGrant = oauthOperations.exchangeForAccess("authCodeFromAndroid", "", parameters);

        Connection<Google> connection = googleConnectionFactory.createConnection(accessGrant);

        //Then you can continue with the ordinary "connection" as usual
        String providerId = connection.getKey().getProviderId();
        String providerUserId = connection.getKey().getProviderUserId();
于 2016-11-05T05:20:01.113 に答える