5

Сервер получает one-time authorization code из мобильного приложения. Мне нужно преобразовать это в токен доступа к токенам и обновить токен и сохранить их на серверной БД для последующего использования.Spring Social Google - преобразование одноразового кода авторизации в токен токена обновления/обновления на сервере

Мой текущий код:

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(); 

oneTimeAuthorizationCode неправильно, так как ConnectionData ожидает маркер доступа, а не код авторизации один раз. Любая идея, как заставить spring-social-google обмениваться одноразовым кодом для токена доступа и обновлять токен?

ответ

2

Это код для обмена код авторизации для доступа лексем

String authorizationcode=*****; 
auth2Operations = googleConnectionFactory.getOAuthOperations(); 
AccessGrant accessGrant =auth2Operations.exchangeForAccess(authorizationcode,"Your  redirect uri",null); 
connection = googleConnectionFactory.createConnection(accessGrant); 
Google google=connection.getApi(); 
0

, чтобы он собирается ваш будет необходимо запросить offline access for Google. В основном изменение просто добавляет параметр запроса «access_type = offline», однако вы получили этот код OneTimeAuthorizationCode. Затем вы получите токен обновления после авторизации.

Для моего проекта, я закончил настройки ProviderSignInController добавить параметров запроса вручную, так как это не позволяет передать его через REST:

@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()); 
    } 
} 
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();