在我的代码中出现以下错误.
400 Bad Request {"error":"redirect_uri_mismatch"}
我不明白出了什么问题.我似乎正在按照规范中的定义正确使用谷歌api.在开发人员控制台中创建安装的应用程序后,我从浏览器获取了授权代码并将其插入.从控制台中选择了redirect_uri.任何人都可以指出我redirect_uri有什么问题.我无法弄清楚该参数有什么问题.
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.DataStoreFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.adexchangeseller.AdExchangeSeller;
import com.google.api.services.adexchangeseller.AdExchangeSellerScopes;
import com.google.api.services.adexchangeseller.model.AdClients;
import com.google.api.services.adexchangeseller.model.AdUnits;
import com.google.api.services.adexchangeseller.model.CustomChannels;
import com.google.api.services.adexchangeseller.model.SavedReports;
import com.google.api.services.adexchangeseller.AdExchangeSeller;
import com.google.api.services.adexchangeseller.AdExchangeSeller.Reports.Generate;
import com.google.api.services.adexchangeseller.model.Report;
import java.io.FileInputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
public class Reporting {
public class AdXReporting {
private static String AD_CLIENT_ID = "....";
private static final String APPLICATION_NAME = "AdX Installed app product";
private static final String authorizationCode = "..............";
private static final String CALLBACK_URL = "urn:ietf:wg:oauth:2.0:oob";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final java.io.File DATA_STORE_DIR = new java.io.File("adexchangeseller_sample");
private static void authorize() {
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
new InputStreamReader(new FileInputStream("client_secrets.json")));
GoogleAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow.Builder(
httpTransport,
JSON_FACTORY,
clientSecrets,
Collections.singleton(AdExchangeSellerScopes.ADEXCHANGE_SELLER_READONLY)
).setDataStoreFactory(dataStoreFactory).build();
GoogleAuthorizationCodeTokenRequest tokenRequest =
flow.newTokenRequest(authorizationCode);
tokenRequest.setRedirectUri(CALLBACK_URL);
GoogleTokenResponse tokenResponse = tokenRequest.execute();
// Store the credential for the user.
flow.createAndStoreCredential(tokenResponse, AD_CLIENT_ID);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
你的指针是正确的.
在错误的情况下,我正在摸不着头两天.
显然,redirect_uri需要在auth和令牌请求之间进行匹配.
如果不是,则抛出redirect_uri_mismatch.
对于谷歌的API文档说使用REDIRECT_URI从开发者控制台.
但是,它们自动生成的URL,要粘贴到浏览器中,不会这样做,并使用不同的localhost +端口 URL.
这是问题的根本原因.
如果您使用auth url,他们要求您在浏览器中剪切并粘贴,并从控制台插入正确的redirect_uri "urn:ietf:wg:oauth:2.0:oob"并获取代码,然后使用相同的redirect_uri获取令牌,然后没有redirect_uri_mismatch.
感谢您的回答.
小智 1
不,我没有从我的一端提供一个redirect_uri来获取授权代码,但它是由我用来获取授权代码的谷歌代码预先填充的一些https localhost uri。它说在浏览器中剪切并粘贴网址以获取授权码。
我用于access_token请求的redirect_uri是不同的值,是我从控制台“urn:ietf:wg:oauth:2.0:oob”剪切并粘贴的值,并且我在控制台设置中确实有一个由google预设的普通本地主机以及已安装的应用程序/其他项目的redirect_uri,但我在本地主机上没有https Web服务器。
redirect_uri 是否应该与授权代码和访问令牌请求匹配?如果是这样,安装的应用程序/其他应用程序应该是什么。我应该使用“urn:ietf:wg:oauth:2.0:oob”作为redirect_uri 来获取授权码吗?
| 归档时间: |
|
| 查看次数: |
2920 次 |
| 最近记录: |