Redirect_uri 当在 ios 应用程序中收到授权码时尝试从后端服务器交换授权码
Redirect_uri when trying to exchange an authcode from backend server when the authcode was received in an ios app
我有一个 ios 应用程序和一个网络应用程序,它们从用户那里获得授权并生成一个授权码并将其发送到后端 java servlet,后者尝试交换授权码以获取访问和刷新令牌.从网络应用程序交换授权码是有效的,但对于从 ios 应用程序生成的授权码,我在交换期间遇到以下错误。
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
"error" : "invalid_request",
"error_description" : "Missing parameter: redirect_uri"
}
这是进行交换的代码
public OAuthCodeExchangeResponse exchangeAuthCode(String authCode, boolean isIosApp) throws JSONException, IOException {
OAuthCodeExchangeResponse response = new OAuthCodeExchangeResponse();
GoogleClientSecrets clientSecrets = getClientSecrets(isIosApp);
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setAccessType("offline")
.build();
GoogleTokenResponse tokenResponse = null;
if(isIosApp == false) {
tokenResponse = flow.newTokenRequest(authCode)
.setRedirectUri("postmessage")
.execute();
} else {
tokenResponse = flow.newTokenRequest(authCode).execute();
}
GoogleIdToken idToken = tokenResponse.parseIdToken();
GoogleIdToken.Payload payload = idToken.getPayload();
response.setAccessToken(tokenResponse.getAccessToken());
response.setEmail(payload.getEmail());
response.setIdToken(tokenResponse.getIdToken());
response.setRefreshToken(tokenResponse.getRefreshToken());
return response;
}
public GoogleClientSecrets getClientSecrets(boolean isIosApp) throws JSONException, IOException {
GoogleClientSecrets.Details d = new GoogleClientSecrets.Details();
if(isIosApp == false) {
d.setClientId(WebClientId);
d.setClientSecret(WebClientSecret);
} else {
d.setClientId(PhoneClientId);
}
GoogleClientSecrets clientSecrets = new GoogleClientSecrets();
clientSecrets.setInstalled(d);
return clientSecrets;
}
交换 ios 应用程序生成的授权码时,我必须设置什么 redirect_uri? google 开发者控制台中为 ios 应用程序创建的凭证没有设置重定向 uri。
urn:ietf:wg:oauth:2.0:oob
您需要安装应用程序的流程,请参阅https://developers.google.com/identity/protocols/OAuth2InstalledApp#formingtheurl
我有一个 ios 应用程序和一个网络应用程序,它们从用户那里获得授权并生成一个授权码并将其发送到后端 java servlet,后者尝试交换授权码以获取访问和刷新令牌.从网络应用程序交换授权码是有效的,但对于从 ios 应用程序生成的授权码,我在交换期间遇到以下错误。
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request { "error" : "invalid_request", "error_description" : "Missing parameter: redirect_uri" }
这是进行交换的代码
public OAuthCodeExchangeResponse exchangeAuthCode(String authCode, boolean isIosApp) throws JSONException, IOException {
OAuthCodeExchangeResponse response = new OAuthCodeExchangeResponse();
GoogleClientSecrets clientSecrets = getClientSecrets(isIosApp);
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setAccessType("offline")
.build();
GoogleTokenResponse tokenResponse = null;
if(isIosApp == false) {
tokenResponse = flow.newTokenRequest(authCode)
.setRedirectUri("postmessage")
.execute();
} else {
tokenResponse = flow.newTokenRequest(authCode).execute();
}
GoogleIdToken idToken = tokenResponse.parseIdToken();
GoogleIdToken.Payload payload = idToken.getPayload();
response.setAccessToken(tokenResponse.getAccessToken());
response.setEmail(payload.getEmail());
response.setIdToken(tokenResponse.getIdToken());
response.setRefreshToken(tokenResponse.getRefreshToken());
return response;
}
public GoogleClientSecrets getClientSecrets(boolean isIosApp) throws JSONException, IOException {
GoogleClientSecrets.Details d = new GoogleClientSecrets.Details();
if(isIosApp == false) {
d.setClientId(WebClientId);
d.setClientSecret(WebClientSecret);
} else {
d.setClientId(PhoneClientId);
}
GoogleClientSecrets clientSecrets = new GoogleClientSecrets();
clientSecrets.setInstalled(d);
return clientSecrets;
}
交换 ios 应用程序生成的授权码时,我必须设置什么 redirect_uri? google 开发者控制台中为 ios 应用程序创建的凭证没有设置重定向 uri。
urn:ietf:wg:oauth:2.0:oob
您需要安装应用程序的流程,请参阅https://developers.google.com/identity/protocols/OAuth2InstalledApp#formingtheurl