Интеграция за влизане в LinkedIn с уеб приложение Spring MVC

Нов съм в Spring и искам да вляза в Spring MVC приложение. С LinkedIn използвам SCRIBE за влизане, но когато стартирам приложението, то хвърля изключение.

Моят код на контролера за linkedin в MVC е като:

  @RequestMapping(value="/loginlinkedin", method=RequestMethod.GET)
    public String callback(WebRequest request){

        OAuthService service=linkedInServiceProvider.getService();
        System.out.println("above request token"); 
        //request token
        Token requestToken=service.getRequestToken(); 

        System.out.println(requestToken);
        System.out.println("below request token");

        //getting authorized url
        String oauth_verif= service.getAuthorizationUrl(requestToken);
        System.out.println(oauth_verif);

        //verifing the requested token
        Verifier verifier=new Verifier(in.nextLine());
        System.out.println("below verifier"+verifier);

        //get AccessToken
        Token accessToken=service.getAccessToken(requestToken, verifier);
        System.out.println("access tolen"+accessToken);


        OAuthRequest oauthRequest=new OAuthRequest(Verb.GET, "http://api.linkedin.com/v1/people/~:(id,first-name,last-name,industry,headline)");
        System.out.println("outhrequest"+oauthRequest);
        service.signRequest(accessToken, oauthRequest);
        Response outhResponse=oauthRequest.send();
        System.out.println(outhResponse.getBody());
        //ModelAndView mav=new ModelAndView("redirect:loginPage");
        return "result";
    }

и боб за свързано влизане:

<bean id="linkedInServiceProvider" class="com.spring.handler.OAuthServiceProvider">
    <constructor-arg name="oauthServiceConfig" ref="linkedInServiceConfig" />
</bean

И клас OAuthServiceConfig за конфигуриране на услуга:

  package com.spring.handler;
import org.scribe.builder.api.Api;
public class OAuthServiceConfig {
private String apiKey;
private String apiSecret;
private String callback;
private Class apiClass;

public OAuthServiceConfig(String apiKey,String apiSecret,String callback,Class apiClass){
    super();
    this.apiKey=apiKey;
    this.apiSecret=apiSecret;
    this.callback=callback;
    this.apiClass=apiClass;
    System.out.println(apiKey+apiSecret+callback+apiClass);
}

public String getApiKey() {
    return apiKey;
}

public void setApiKey(String apiKey) {
    this.apiKey = apiKey;
}

public String getApiSecret() {
    return apiSecret;
}

public void setApiSecret(String apiSecret) {
    this.apiSecret = apiSecret;
}

public String getCallback() {
    return callback;
}

public void setCallback(String callback) {
    this.callback = callback;
}

public Class getApiClass() {
    return apiClass;
}

public void setApiClass(Class apiClass) {
    this.apiClass = apiClass;
}



}

и OAuthServiceProvider клас за предоставяне на услугата на OAuthService с помощта на linkedInServiceProvider.getService() метод:

   package com.spring.handler;

import org.scribe.builder.ServiceBuilder;
import org.scribe.oauth.OAuthService;

public class OAuthServiceProvider {
    OAuthServiceConfig oauthServiceConfig;

    public OAuthServiceProvider() {
    }

    public OAuthServiceProvider(OAuthServiceConfig oauthServiceConfig) {
        this.oauthServiceConfig = oauthServiceConfig;
    }

    public OAuthService getService() {
        System.out.println(oauthServiceConfig);
        return new ServiceBuilder().provider(oauthServiceConfig.getApiClass())
                .apiKey(oauthServiceConfig.getApiKey())
                .apiSecret(oauthServiceConfig.getApiSecret())
                .callback(oauthServiceConfig.getCallback()).build();
    }
}

Но когато вляза в приложението, хвърленото изключение е:

May 28, 2015 5:42:17 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [HelloWebHandler] in context with path [/SpringHandler] threw exception [Request processing failed; nested exception is org.scribe.exceptions.OAuthException: Response body is incorrect. Can't extract token and secret from this: 'oauth_problem=permission_unknown'] with root cause
org.scribe.exceptions.OAuthException: Response body is incorrect. Can't extract token and secret from this: 'oauth_problem=permission_unknown'
    at org.scribe.extractors.TokenExtractorImpl.extract(TokenExtractorImpl.java:41)
    at org.scribe.extractors.TokenExtractorImpl.extract(TokenExtractorImpl.java:27)
    at org.scribe.oauth.OAuth10aServiceImpl.getAccessToken(OAuth10aServiceImpl.java:104)
    at org.scribe.oauth.OAuth10aServiceImpl.getAccessToken(OAuth10aServiceImpl.java:85)
    at org.scribe.oauth.OAuth10aServiceImpl.getAccessToken(OAuth10aServiceImpl.java:90)
    at com.spring.handler.UserController.callback(UserController.java:109)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

person Sunoo    schedule 28.05.2015    source източник
comment
Възможно дублиране на stackoverflow.com/questions/29755678/   -  person Ranjitsinh    schedule 28.05.2015


Отговори (1)


permission_unknown: Потребителят не е решил дали да разреши на този Потребител достъп до защитени ресурси. Обикновено се случва, когато потребителят поиска токен за достъп, преди потребителят да завърши процеса на оторизация.

За да проследите и разрешите проблема си:

  • Включете режима за отстраняване на грешки на scribe при изпълнение на debug() метод на ServiceBuilder.
  • Прочетете внимателно Начално ръководство от scribe -ява
  • Прегледайте кода си за несъответствия:
    //verifing the requested token
    Verifier verifier=new Verifier(in.nextLine());
    System.out.println("below verifier"+verifier);

Какво е in? трябва да проверите токена на заявката, изглежда, че сте копирали този ред от примерите за писане, така или иначе е трудно да се повярва, че кодът ви работи, защото in не е деклариран.

  • Изградете отново вашия контролер: първо внедрете метода за стартиране на удостоверяване, вземете или запазете атрибута на токена на заявката и пренасочете към URL адреса за оторизация (linkedin url), ако е необходимо (service.getAuthorizationUrl()); внедрете вашия метод за обратно извикване (след като потребителят е одобрил достъпа до неговия профил, той се пренасочва към нашата крайна точка за обратно извикване, дефинирана във вашия OAuthServiceConfig клас) и вземете oauth_verifier и токена на заявката, за да потвърдите и получите accessToken, запазете го, подпишете заявката... и т.н... и т.н
person vzamanillo    schedule 28.05.2015
comment
няма начин, не съм копирал никъде, да, следвам същото ръководство като вашата връзка по-горе, всъщност забравих да напиша Scanner in=new Scanner(System.in) тук; и когато достигне до Verifier verifier=new Verifier(in.nextLine()); след това давам секретния ключ на приложението LinkedIn като параметър и след връщането му проверяващия обект. след това ,,проблем .. за достъп до ,токен. - person Sunoo; 28.05.2015
comment
в предложеното ръководство, какво е верификатор, който сте получили от потребителя в Verifier v = нов верификатор (верификатор, който сте получили от потребителя); - person Sunoo; 28.05.2015
comment
Предава ли се oauth_verifier на вашия метод за обратно извикване след удостоверяването на linkedin. - person vzamanillo; 28.05.2015
comment
Не, отстранявам грешки в кода си, след което кодът работи добре до верификатора след това, получавам проблема при достъпа до токените, изключение е Неправилно тяло на отговора, не може да се извлече токен и тайна - person Sunoo; 29.05.2015
comment
Не разбрахте как работи script и не разбрахте как работи oauth и не сте възстановили контролера си, така или иначе приложението ви няма да работи, защото не съхранявате нищо в атрибутите на сесията, съжалявам, че не мога да ви помогна повече. - person vzamanillo; 29.05.2015
comment
Не, работя върху това и разбирам как работи script, сега възстановявам контролера, така че, моля, дайте ми малко време да възстановя контролера... - person Sunoo; 29.05.2015