2016-08-11 13 views
0

OAuth2を使用するサイトに認証しようとしていて、セッションオブジェクトにトークンを格納しようとしています。私のWebアプリケーションは最初にそこにトークンがあるかどうかをチェックし、存在しない場合は、外部サイトのログインページにユーザーをリダイレクトします。ユーザーはログインしてアプリケーションにリダイレクトされます。これまでのところ、とても良い、これは動作します。私のアプリは私を外部サイト(Mendeley)に誘導し、そこにログインしてから、私の期待するアプリケーションのURLに私をリダイレクトします。OAuth2がトークンを返す401

それは戻って私のアプリにリダイレクトするとき、私はコードリクエストに応じて状態パラメータを期待して、私はこれらを参照してくださいので、私は、私は正しい軌道に乗ってると仮定し、私は「場合(私を停止m間違っている)。それで、私が正しく理解すれば、私はコードをMendeleyサービスに送って、私の認証トークンを取得することになっています。それはそれがすべて爆発するところです。

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

私が得る応答コードが、それが例外をスローし、接続からInputStreamを取得しようとしている最後の行では401であり、それは私には理にかなっているが、それは401を返し、持っていない感知します1。

はい、redirect_uriがエンコードされています。 (私はログインへの最初のリダイレクトがそうでなければ動作しないと思う)

私の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 のContent-Length:82

{ "エラー": "invalid_grant"、 "ましたerror_description": "無効なアクセスコード"}

値がないと、invalid_requestエラーコードで応答が生成されます。 無効な値(以前に使用されたコードを含む)は、invalid_grantエラーコードを持つ という応答を生成します。 authorization_code(またはrefresh_token)以外の値を指定すると、 unsupported_grant_typeエラーコードの応答が生成されます。

あなたは何が間違っているかを見るためにレスポンスボディの内部を見ることはできません。

+0

私はそれを試みました。今私はレスポンスコード400を取得しているので、進歩しているかどうかはわかりません。 – javaguyels

+0

また、認証ヘッダーがあるため、本文にクライアントIDとシークレットが必要ない場合があります。それが何かを壊すかどうかは分かりません。 – fbiagi

+0

それは何も壊れていませんが、@fbiagiは正しいですが、リクエストの本文にclientidとsecretを追加しないでください。あなたはすでに彼の認証ヘッダにそれらを渡しています –

関連する問題