Stormpath не може да извлече обект на акаунт за влизане в Google

Абсолютно следвах ръководството на Google< /strong> към писмата и ръководството на stormpath за интегриране с googleсъщо към буквите

Сега потребителят може да влезе успешно с Google, но Stormpath хвърля изключение на този ред, когато се опитва да извлече обект на Stormpath Account, използвайки кода за оторизация, получен от google;

ProviderAccountResult result = application.getAccount(request);

Ето кодовия фрагмент;

public static Account getAccount(String codeOrToken, AuthType authType){
    try{
        if(getDirectory() != null){
            ProviderAccountRequest request = null;
            switch(authType){
                case AUTH_CODE: 
                    request = Providers.GOOGLE.account().setCode(codeOrToken).build(); 
                    break;
                case ACCESS_TOKEN: 
                    request = Providers.GOOGLE.account().setAccessToken(codeOrToken).build(); 
                    break;
                default: 
                    break;
            }
            Application application = AuthUtil.getApplication();
            ProviderAccountResult result = application.getAccount(request);
            Account account = result.getAccount();
            account.getCustomData().put("isNew", result.isNewAccount());
            return account;
        }
    }catch(Exception ex){
        ex.printStackTrace();
    }
    return null;
}

И ето изключение StackTrace;

16:45:02,170 ERROR [stderr] (http-localhost-127.0.0.1-8080-5) com.stormpath.sdk.resource.ResourceException: HTTP 400, Stormpath 7200 (http://docs.stormpath.com/errors/7200): Stormpath was not able to complete the request to Google: this can be caused by either a bad Google directory configuration, or the provided account credentials are not valid. Google error message: 400 Bad Request
16:45:02,172 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultDataStore.execute(DefaultDataStore.java:492)

16:45:02,173 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultDataStore.access$000(DefaultDataStore.java:67)

16:45:02,174 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultDataStore$2.filter(DefaultDataStore.java:390)

16:45:02,175 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultFilterChain.filter(DefaultFilterChain.java:47)

16:45:02,176 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.ProviderAccountResultFilter.filter(ProviderAccountResultFilter.java:31)

16:45:02,177 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultFilterChain.filter(DefaultFilterChain.java:52)

16:45:02,178 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.api.ApiKeyQueryFilter.filter(ApiKeyQueryFilter.java:74)

16:45:02,180 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultFilterChain.filter(DefaultFilterChain.java:52)

16:45:02,181 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.cache.WriteCacheFilter.filter(WriteCacheFilter.java:80)

16:45:02,184 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultFilterChain.filter(DefaultFilterChain.java:52)

16:45:02,184 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.cache.ReadCacheFilter.filter(ReadCacheFilter.java:62)

16:45:02,185 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultFilterChain.filter(DefaultFilterChain.java:52)

16:45:02,186 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.api.DecryptApiKeySecretFilter.filter(DecryptApiKeySecretFilter.java:62)

16:45:02,187 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultFilterChain.filter(DefaultFilterChain.java:52)

16:45:02,188 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.EnlistmentFilter.filter(EnlistmentFilter.java:42)

16:45:02,189 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultFilterChain.filter(DefaultFilterChain.java:52)

16:45:02,189 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultDataStore.save(DefaultDataStore.java:411)

16:45:02,190 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.ds.DefaultDataStore.create(DefaultDataStore.java:322)

16:45:02,191 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.provider.ProviderAccountResolver.resolveProviderAccount(ProviderAccountResolver.java:46)

16:45:02,192 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at com.stormpath.sdk.impl.application.DefaultApplication.getAccount(DefaultApplication.java:325)

16:45:02,193 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at ng.ajo.socials.Google.getAccount(Google.java:79)

16:45:02,193 ERROR [stderr] (http-localhost-127.0.0.1-8080-5)   at ng.ajo.server.SocialsServlet.doPost(SocialsServlet.java:81)

//... The rest omitted for brevity

Моля, какво може да правя погрешно и какво може да е решението на този проблем?

РЕДАКТИРАНЕ:

Ако това помага за предоставянето на повече контекст, ето как създавам своя Google Директория:

public class Google {

    public static Directory getDirectory(){
        try{
            Directory directory = DirectoryUtil.getGoogleDirectory();

            //if the google directory does not exist CREATE it
            if(directory == null){
                Client client = AuthUtil.getClient();
                directory = client.instantiate(Directory.class);
                directory.setName(dirName);
                directory.setDescription(dirDescription);

                CreateDirectoryRequest request = Directories.newCreateRequestFor(directory)
                            .forProvider(Providers.GOOGLE.builder()
                                    .setClientId(appID)
                                    .setClientSecret(appSecret)
                                    .setRedirectUri(redirectURI)
                                    .build()
                            ).build();

                Tenant tenant = client.getCurrentTenant();
                directory = tenant.createDirectory(request);
                Application application = AuthUtil.getApplication();
                application.addAccountStore(directory.getHref());
            }

            return directory;

        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

И когато вляза в моята уеб конзола Stormpath, мога да видя, че директорията е създадена и наистина съществува с всички конфигурации на място... сега, цялото това нещо трябва да работи , но не... все още ме оставя объркан!


person SourceVisor    schedule 04.12.2015    source източник


Отговори (1)


  1. Отидете на https://console.developers.google.com/apis/credentials
  2. Уверете се, че сте „Добавили идентификационни данни“
  3. Обърнете внимание на „Клиентски идентификатор“ и „Клиентска тайна“
  4. Добавете някои „Оторизирани URI адреси за пренасочване“, като http://localhost:8080/googleOauthCallback
  5. Влезте на адрес https://api.stormpath.com
  6. Добавете указател на Google, предоставящ правилните ID, Secret и Redirect URI
  7. Сега нека получим код на Google по лесен начин (без да се налага да създаваме уеб проект). Отворете този URL във вашия браузър; когато бъдете подканени, изберете акаунта в Gmail, който искате да използвате.

    https://accounts.google.com/o/oauth2/auth?client_id=XXXXXXX
    &response_type=code
    &scope=openid%20email
    &redirect_uri=http://localhost:8080/googleOauthCallback
    

    Забележка: XXXXXXX трябва да се замени с ИД на клиента, който сте получили в стъпка 3.

  8. Ще получите грешка cannot connect to server, но това е ОК, тъй като ние не изпълняваме уеб приложение, където Google може да ни се обади обратно. Важното тук е в URL адреса. Просто копирайте стойността code. Ще бъде нещо като 4/tcHrwq4N1eah1rwotyCEaXq-yfxBOYrIAVe2_ouHTMQ

  9. Този код ще извлече акаунта в Google чрез Stormpath:

    Client client = Clients.builder().build();
    
    Application application = client.getResource(applicationHref, Application.class);
    
    ProviderAccountRequest request = Providers.GOOGLE.account()
            .setCode(code) //where code is the value we obtained in step 8
            .build();
    
    ProviderAccountResult result = application.getAccount(request);
    System.out.println("Account Email: " + result.getAccount().getEmail());
    ProviderData providerData = result.getAccount().getProviderData();
    System.out.println("Access Token: " + ((GoogleProviderData)providerData).getAccessToken());
    

Това е всичко...

person mario    schedule 07.12.2015
comment
Здравей @jstack, благодаря за отговора. В моето приложение направих всички тези неща... Вече много добре получих този код за оторизация... Всичко работи добре до онзи ред ProviderAccountResult result = application.get account(request);... Може би има нещо общо с това как получавам моите Client или Application обект, не знам и въпреки че изглежда странно, че това може да е причината, все пак ще опитам да го направя, както сте показали, и ще се върна с това, което се случва. Благодаря. - person SourceVisor; 08.12.2015
comment
Проверете дали: 1) приложението Stormpath има Google Directory като хранилище на акаунти. 2) Вие предавате кода (а не accessToken в метода code(String). 3) Ако имате повече от едно приложение на Google, уверете се, че директорията, която конфигурирате в Stormpath, съответства на същото приложение на Google, което генерирате кода за - person mario; 08.12.2015
comment
здравей @jstack, направих всички тези неща, но без успех. Всъщност, ако погледнете кода, който предоставих във въпроса, ще видите, че правя точно това, което описахте. Моят AuthUtil.getApplication(); прави точно това client.getResource(applicationHref, Application.class);. Когато отстранявам грешки в eclipse, откривам, че (1.) application Обектът е извлечен правилно (2.) Имам code от Google, който изглежда нещо подобно 4/sz8XzIk5lPbgaQB3hNVg2M6pH06BdLC0G2IPdETujWM (3.) request Обектът е изграден правилно (*) ПРОБЛЕМЪТ е application.getAccount(request) все още хвърля това изключение; - person SourceVisor; 11.12.2015
comment
Хей, @jsatck току-що се случи нещо странно. Използвах code, получен чрез изпращане на GET заявка точно както посочихте, успях да извлека обекта Account, без каквото и да е изключение... Странно е, че дори не промених нищо в кодовата си база. Единственото нещо, което направих, беше просто да изпратя заявка за получаване с моите параметри в този URL адрес. Сега се чудя има ли някаква разлика между code, което получавам от влизането в Google developers.google.com/identity/sign-in/web/server-side-flow и code, които получавам, като изпратя заявка за получаване на този URL адрес?... Защо работи с Stormpath и другият не? - person SourceVisor; 11.12.2015
comment
Кодът, който получавате от developers.google.com/identity/sign -in/web/server-side-flow е предназначен да се използва за комуникация сървър-сървър, а не потребител-сървър. Зад кулисите Strormpath използва този механизъм от сървър към сървър, но трябва да създадете базиран на потребителя код: developers.google.com/identity/protocols/OAuth2UserAgent - person mario; 11.12.2015
comment
Страхотен. Би било чудесно, ако можете да гласувате за това решение, за да може да помогне на други разработчици в бъдеще. Благодаря! - person mario; 11.12.2015
comment
и @jstack, ако работите в Stormpath, би било хубаво да накарате вашите хора да добавят този малък детайл ясно към документацията на Stormpath - person SourceVisor; 11.12.2015
comment
бих искал да използвам тази възможност да ми помогнете и с другия ми въпрос тук... stackoverflow.com/questions/34228709/ - person SourceVisor; 11.12.2015