2016-08-11 2 views
0

OAuth2를 사용하는 사이트에 대한 인증을 시도하고 내 세션 객체에 토큰을 저장하려고합니다. 내 웹 앱은 처음에는 토큰이 있는지를 먼저 확인하고없는 경우 외부 사용자가 로그인하여 내 앱으로 리디렉션되는 외부 사이트의 로그인 페이지로 리디렉션합니다. 지금까지, 아주 좋아,이 작품. 내 앱이 나를 외부 사이트 (Mendeley)로 안내하고, 거기에 로그인 한 다음, 예상했던 앱의 URL로 다시 리디렉션합니다. 나는 '경우 토큰을 요청하는 OAuth2가 401을 반환합니다.

내 응용 프로그램을 다시 리디렉션

, 나는이 코드 및 요청에 상태 매개 변수를 기대하고, 내가이 참조 할, 그래서 내가 곧 정상 궤도에있어 가정 (날 막을 m 잘못된). 그렇다면 정확하게 이해하면 코드을 다시 멘델리 서비스에 게시하여 내 승인 토큰을 얻으려고합니다. 그게 전부가 폭발하는 곳입니다.

URL url = new URL("https://api-oauth2.mendeley.com/oauth/token"); 
HttpsURLConnection connection = (HttpsURLConnection) url 
     .openConnection(); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Type", 
    "application/x-www-form-urlencoded"); 

     String authString = getClientId() + ":" + "[MY CLIENT SECRET]"; 
     System.out.println("auth string: " + authString); 
     byte[] authEncBytes = Base64.getUrlEncoder().encode(
       authString.getBytes()); 
     String authStringEnc = new String(authEncBytes); 
     System.out.println("Base64 encoded auth string: " + authStringEnc); 

     connection.addRequestProperty("Authorization", "Basic " 
       + authStringEnc); 

connection.setDoOutput(true); 
OutputStream os = connection.getOutputStream(); 
OutputStreamWriter writer = new OutputStreamWriter(os); 
writer.write("scope=all&grant_type=authorization_code"); 
writer.write("&client_id="); 
writer.write(getClientId()); 
writer.write("&code="); 
writer.write(code); 
writer.write("&redirect_uri="); 
writer.write(getMendeleyRedirectUrl(request)); 
writer.write("&client_secret="); 
writer.write("[MY CLIENT SECRET]"); 
writer.flush(); 
writer.close(); 
int responseCode = connection.getResponseCode(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(
     connection.getInputStream())); 

내가 얻을 응답 코드가 예외를 throw 연결에서 가져올 입력 스트림을 가져옵니다하려고 마지막 줄에 (401), 그리고 그 날에 감각이 401을 반환 감지하게하고 있지 않습니다 하나.

예, redirect_uri가 인코딩됩니다. (로그인에 대한 초기 리디렉션은 다른 방법으로는 작동하지 않을 것이라고 생각합니다.)

My Spidey Sense는 나에게 분명해야 할 부분을 간과하고 있다고 말하지만 내가 생각할 수있는 모든 것을 시도했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

편집 : 인증 헤더가 지금 응답 코드 (400)

+0

인증 기본은 base64 인코딩 " : "이어야합니다.이 경우 사용자는 앱 ID 및 비밀번호 앱 비밀번호가됩니다. – fbiagi

답변

0

올바른 기본 인증 헤더를 생성하는 경우가 확인해야합니다을 받고, 추가되는 방식을 변경했습니다. 다음과 같아야합니다.

String user = "your app id"; 
String password = "your app secret"; 
String authValue = user + ":" + password; 

Base64.Encoder encoder = Base64.getEncoder(); 
Bytes[] btyes = authValue.getBytes(StandardCharsets.UTF_8); 

String authValueEncoded = encoder.encodeToString(bytes); 

connection.addRequestProperty("Authorization", 
        "Basic "+authValueEncoded); 

이 값은 Mendeley에만 해당됩니다. http://dev.mendeley.com/reference/topics/authorization_auth_code.html의 4 단계 참조

오류 400에 대해서는 grant_type, code 또는 redirect_uri를 확인하십시오. 코드는 한 번만 사용할 수 있습니다.

부정확하거나 400 잘못된 요청의 상태와 JSON 형식 오류 코드 및 메시지와 HTTP 잘못된 요청 응답에 grant_type, 코드와 redirect_uri로 결과 값 누락으로 인해

오류 :

워드 프로세서에서

HTTP/1.1 400 잘못된 요청 내용 - 형식 : 응용 프로그램/JSON 콘텐츠 길이 : 82

{ "오류": "invalid_grant", "ERROR_DESCRIPTION": "잘못된 액세스 코드"}

누락 값은 invalid_request 오류 코드가있는 응답을 생성합니다. 유효하지 않은 값 (이전에 사용한 코드 포함)은 invalid_grant 오류 코드와 함께 응답을 생성합니다. authorization_code (또는 refresh_token) 이외의 값을 지정하면 unsupported_grant_type 오류 코드와 함께 응답이 생성됩니다.

그래서 무엇이 잘못되었는지를보기 위해 응답 본문을 보지 않을 수 있습니다.

+0

나는 그것을 시험해 보았다. 이제 응답 코드 400이 나오므로 진행 여부를 잘 모릅니다. – javaguyels

+0

또한 auth 헤더가 있으므로 본문에 클라이언트 ID 및 암호가 필요하지 않을 수 있습니다. 그것이 뭔가를 깨뜨릴 지 확실하지 않습니다. – fbiagi

+0

그것은 아무것도 해치지 않지만 @fbiagi가 옳다면 요청의 본문에 clientid와 secret를 추가하지 마십시오. 이미 auth 헤더에 전달했습니다. –

관련 문제