gpt4 book ai didi

java - 401 错误未知授权检索谷歌日历

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:42 27 4
gpt4 key购买 nike

当我执行 CalendarService.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());我收到 OAuthException 401 错误未知授权 header 。

我正在使用 GWT+GAE 我不知道为什么会收到此错误,oauthParameters 似乎没问题。

  1. 我让用户登录登录服务.登录
  2. 我检查我是否有认证已经开启oauthService.checkOauthTokenSecret
  3. 如果没有,我会重定向到 GoogleGCalendar 的批准页面许可
  4. 我得到查询字符串由谷歌返回,我获得了访问权限 token 和访问 token secret 和将其设置为用户实体以备后用在 oauthService.upgradeLogin 上使用。
  5. 并尝试启用日历oauthService.getPublicCalendars。

我在 mvp4g 框架中使用 MVP 模式,抱歉,如果有点困惑 0:-)

知道我为什么会收到 401 错误吗?我认为我正在通过客户端和服务器以及外部页面上下移动......并且缺少一些东西:-(但所有参数似乎都已正确填写。

客户端

public void onStart(){
GWT.log("onStart");
loginService.login(GWT.getHostPageBaseURL(), new AsyncCallback<LoginInfo>() {
@Override
public void onSuccess(LoginInfo result) {
Common.loginInfo = result;
if(Common.loginInfo.isLoggedIn()) {
oauthService.checkOauthTokenSecret(new AsyncCallback<String>() {
@Override
public void onSuccess(String result) {
if (result == null){
eventBus.OauthLogin();
}else{
oauthService.upgradeLogin(Window.Location.getQueryString(),Common.loginInfo, new AsyncCallback<LoginInfo>() {
@Override
public void onSuccess(LoginInfo result) {
Common.loginInfo = result;
getCitas();
}
@Override public void onFailure(Throwable caught) {
Common.handleError(caught);
}
});
}
}
@Override public void onFailure(Throwable caught) {
Common.handleError(caught);
}
});
}else{
eventBus.LoadLogin();
}
}
@Override public void onFailure(Throwable caught) {
Common.handleError(caught);
}
});
}

服务器端

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletContext;

import com.google.gdata.client.authn.oauth.GoogleOAuthHelper;
import com.google.gdata.client.authn.oauth.GoogleOAuthParameters;
import com.google.gdata.client.authn.oauth.OAuthException;
import com.google.gdata.client.authn.oauth.OAuthHmacSha1Signer;
import com.google.gdata.client.authn.oauth.OAuthParameters;
import com.google.gdata.client.calendar.CalendarService;
import com.google.gdata.data.calendar.CalendarEntry;
import com.google.gdata.data.calendar.CalendarFeed;
import com.google.gdata.util.ServiceException;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.rdt.citas.client.OAuthoritzationService;
import com.rdt.citas.client.shared.LoginInfo;

public class OAuthoritzationServiceImpl extends RemoteServiceServlet
implements OAuthoritzationService {

/**
*
*/
private static final long serialVersionUID = 1L;

private static final Logger log = Logger.getLogger(OAuthoritzationServiceImpl.class.getName());

private static String KEY_PARAM = "oauth_consumer_key";
private static String SECRET_PARAM = "oauth_consumer_secret";
private static String SCOPE_PARAM = "scope_calendars";
private static String CALLBACK_PARAM = "oauth_callback";


public String checkOauthTokenSecret(){

ServletContext context = this.getServletContext();
getOauthParams(context);

return (String) this.getThreadLocalRequest().getSession().getAttribute("oauthTokenSecret");;
}

public String getApprovalOAuthPageURL() throws IOException{

ServletContext context = this.getServletContext();
getOauthParams(context);

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();

oauthParameters.setOAuthConsumerKey(getFromSession(KEY_PARAM));
oauthParameters.setOAuthConsumerSecret(getFromSession(SECRET_PARAM));
oauthParameters.setScope(getFromSession(SCOPE_PARAM));
oauthParameters.setOAuthCallback(getFromSession(CALLBACK_PARAM));
GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer());

try {
oauthHelper.getUnauthorizedRequestToken(oauthParameters);

String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters);
String oauthTokenSecret = oauthParameters.getOAuthTokenSecret();

this.getThreadLocalRequest().getSession().setAttribute("oauthTokenSecret", oauthTokenSecret);

return approvalPageUrl;

} catch (OAuthException e) {
log.log(Level.WARNING,e.toString());
return "";
} finally{
}

}

public LoginInfo upgradeLogin(String queryString, LoginInfo login){
// receiving '?key1=value1&key2=value2
queryString = queryString.substring(1, queryString.length());
String k = getFromSession(KEY_PARAM);
String s = getFromSession(SECRET_PARAM);

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(k);
oauthParameters.setOAuthConsumerSecret(s);

String oauthTS = (String) this.getThreadLocalRequest().getSession().getAttribute("oauthTokenSecret");//oauthParameters.getOAuthTokenSecret();
oauthParameters.setOAuthTokenSecret(oauthTS);

GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer());
oauthHelper.getOAuthParametersFromCallback(queryString,oauthParameters);

login.setQueryStringTokens(queryString);
login.setAccessTokenSecret(oauthTS);

try {
String accesToken = oauthHelper.getAccessToken(oauthParameters);
login.setTokenSecret(accesToken);
} catch (OAuthException e) {
log.log(Level.WARNING,e.toString());
}
return login;
}

public ArrayList<String> getPublicCalendars(String accessToken, String accessTokenSecret){
ArrayList<String> result = new ArrayList<String>();
CalendarFeed calendarResultFeed = null;

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(getFromSession(KEY_PARAM));
oauthParameters.setOAuthConsumerSecret(getFromSession(SECRET_PARAM));
oauthParameters.setOAuthToken(accessToken);
oauthParameters.setOAuthTokenSecret(accessTokenSecret);
oauthParameters.setOAuthType(OAuthParameters.OAuthType.THREE_LEGGED_OAUTH);
oauthParameters.setScope(getFromSession(SCOPE_PARAM));

CalendarService myService = new CalendarService("exampleCo-exampleApp-1");

try {
myService.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());
URL calendarFeedUrl = new URL("https://www.google.com/calendar/feeds/default/owncalendars/full");
calendarResultFeed = myService.getFeed(calendarFeedUrl, CalendarFeed.class);
} catch (OAuthException e) {
log.info("OAuthException");
log.log(Level.WARNING,e.toString());
e.printStackTrace();
} catch (MalformedURLException e) {
log.info("MalformedURLException");
log.log(Level.WARNING,e.toString());
e.printStackTrace();
} catch (IOException e) {
log.info("IOException");
log.log(Level.WARNING,e.toString());
e.printStackTrace();
} catch (ServiceException e) {
log.info("ServiceException");
log.log(Level.WARNING,e.toString());
e.printStackTrace();
}

if (calendarResultFeed != null && calendarResultFeed.getEntries() != null) {
for (int i = 0; i < calendarResultFeed.getEntries().size(); i++) {
CalendarEntry entry = calendarResultFeed.getEntries().get(i);
result.add(entry.getTitle().getPlainText());
}
}
return result;
}


private void getOauthParams(ServletContext context) {
this.getThreadLocalRequest().getSession()
.setAttribute(KEY_PARAM, context.getInitParameter(KEY_PARAM));
this.getThreadLocalRequest().getSession()
.setAttribute(SECRET_PARAM, context.getInitParameter(SECRET_PARAM));
this.getThreadLocalRequest().getSession()
.setAttribute(SCOPE_PARAM, context.getInitParameter(SCOPE_PARAM));
this.getThreadLocalRequest().getSession()
.setAttribute(CALLBACK_PARAM, context.getInitParameter(CALLBACK_PARAM));
}

private String getFromSession(String param){
return (String) this.getThreadLocalRequest().getSession().getAttribute(param);
}

}

最佳答案

我最近一直在使用 oAuth。在 upgradeLogin(...) 中,当您升级到访问 token 时,您不会获取相应的访问 token secret 。

getAccessToken() 请求之后的访问 token secret 与请求之前的访问 token secret 不同。您当前正在设置访问 token 密码(通过 login.setAccessTokenSecret(oauthTS)),它是您正在使用的预先更新的访问 token 密码值。需要设置为更新请求后返回的access token secret值:

String accesToken = oauthHelper.getAccessToken(oauthParameters);
String accesTokenSecret = oauthParameters.getOAuthTokenSecret();
login.setTokenSecret(accesToken);
login.setAccessTokenSecret(accesTokenSecret);

您可能还想将这个更新后的 token / secret 对存储在某个地方。然后应该在 getPublicCalendars(...) 中使用访问 token secret 的这个值:

oauthParameters.setOAuthTokenSecret(accessTokenSecret);

更新后访问 token / secret 对是长期存在的,因此可以重复使用(无需再次更新)直到它被撤销。

我顺便找到了 oAuth Playground Tool有助于诊断我的问题。

希望对你有帮助

关于java - 401 错误未知授权检索谷歌日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6175639/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com