Google API oAuth2.0--消费者未注册

Google API oAuth2.0--消费者未注册,api,oauth-2.0,Api,Oauth 2.0,我有OAuth2.0代码,可以与其他服务(如LinkedIn和Facebook)一起使用,但niot Google除外 代码因“消费者未注册”而失败。当然是这样。也就是说,如果这个错误意味着我认为它意味着什么,但我有以下几点 一个项目 和有效的客户端ID条目 客户端ID:107**********4ek7fl.apps.googleusercontent.com 客户机密:Q6KbA**********FRbL 重定向URI:urn:ietf:wg:oauth:2.0:oob,htp://{lo

我有OAuth2.0代码,可以与其他服务(如LinkedIn和Facebook)一起使用,但niot Google除外

代码因“消费者未注册”而失败。当然是这样。也就是说,如果这个错误意味着我认为它意味着什么,但我有以下几点

  • 一个项目
  • 和有效的客户端ID条目
  • 客户端ID:107**********4ek7fl.apps.googleusercontent.com

    客户机密:Q6KbA**********FRbL

    重定向URI:urn:ietf:wg:oauth:2.0:oob,htp://{localhost}

    当请求第一次发送到时会发生故障


    没有显示要求用户进行身份验证的页面,Google服务器在响应正文中返回“消费者未注册”。

    我遇到了类似的问题。我正在使用scribe oauth java库。它对Google的支持只有oauth 1.0,所以我必须编写自己的类来扩展org.scribe.builder.api.DefaultApi20,而不是org.scribe.builder.api.DefaultApi10a

    基本上你是:

    package org.scribe.builder.api;
    
    import java.util.Date;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import org.scribe.exceptions.OAuthException;
    import org.scribe.extractors.AccessTokenExtractor;
    import org.scribe.model.OAuthConfig;
    import org.scribe.model.OAuthConstants;
    import org.scribe.model.OAuthRequest;
    import org.scribe.model.Response;
    import org.scribe.model.Token;
    import org.scribe.model.Verb;
    import org.scribe.model.Verifier;
    import org.scribe.oauth.OAuth20ServiceImpl;
    import org.scribe.oauth.OAuthService;
    import org.scribe.utils.OAuthEncoder;
    import org.scribe.utils.Preconditions;
    
    /**
     * Google OAuth2.0
     * Released under the same license as scribe (MIT License)
     * @author houman001
     * This code borrows from and modifies changes made by @yincrash
     * @author yincrash
     *
     */
    public class Google2Api extends DefaultApi20 {
    
        private static final String AUTHORIZE_URL = "https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=%s&redirect_uri=%s";
        private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s";
        private static final String SUFFIX_OFFLINE = "&" + OAuthConstants.ACCESS_TYPE + "=" + OAuthConstants.ACCESS_TYPE_OFFLINE
                + "&" + OAuthConstants.APPROVAL_PROMPT + "=" + OAuthConstants.APPROVAL_PROMPT_FORCE;
    
    
        @Override
        public String getAccessTokenEndpoint() {
            return "https://accounts.google.com/o/oauth2/token";
        }
    
        @Override
        public AccessTokenExtractor getAccessTokenExtractor() {
            return new AccessTokenExtractor() {
    
                public Token extract(String response) {
                    Preconditions.checkEmptyString(response, "Response body is incorrect. Can't extract a token from an empty string");
    
                    Matcher matcher = Pattern.compile("\"access_token\" : \"([^&\"]+)\"").matcher(response);
                    if (matcher.find())
                    {
                        String token = OAuthEncoder.decode(matcher.group(1));
                        String refreshToken = "";
                        Matcher refreshMatcher = Pattern.compile("\"refresh_token\" : \"([^&\"]+)\"").matcher(response);
                        if (refreshMatcher.find())
                            refreshToken = OAuthEncoder.decode(refreshMatcher.group(1));
                        Date expiry = null;
                        Matcher expiryMatcher = Pattern.compile("\"expires_in\" : ([^,&\"]+)").matcher(response);
                        if (expiryMatcher.find())
                        {
                            int lifeTime = Integer.parseInt(OAuthEncoder.decode(expiryMatcher.group(1)));
                            expiry = new Date(System.currentTimeMillis() + lifeTime * 1000);
                        }
                        Token result = new Token(token, refreshToken, expiry, response);
                        return result;
                    }
                    else
                    {
                        throw new OAuthException("Response body is incorrect. Can't extract a token from this: '" + response + "'", null);
                    }
                }
            };
        }
    
        @Override
        public String getAuthorizationUrl(OAuthConfig config) {
            // Append scope if present
            if (config.hasScope()) {
                String format = config.isOffline() ? SCOPED_AUTHORIZE_URL + SUFFIX_OFFLINE : SCOPED_AUTHORIZE_URL;
                return String.format(format, config.getApiKey(),
                        OAuthEncoder.encode(config.getCallback()),
                        OAuthEncoder.encode(config.getScope()));
            } else {
                String format = config.isOffline() ? AUTHORIZE_URL + SUFFIX_OFFLINE : AUTHORIZE_URL;
                return String.format(format, config.getApiKey(),
                        OAuthEncoder.encode(config.getCallback()));
            }
        }
    
        @Override
        public Verb getAccessTokenVerb() {
            return Verb.POST;
        }
    
        @Override
        public OAuthService createService(OAuthConfig config) {
            return new GoogleOAuth2Service(this, config);
        }
    
        private static class GoogleOAuth2Service extends OAuth20ServiceImpl {
    
            private DefaultApi20 api;
            private OAuthConfig config;
    
            public GoogleOAuth2Service(DefaultApi20 api, OAuthConfig config) {
                super(api, config);
                this.api = api;
                this.config = config;
            }
    
            @Override
            public Token getAccessToken(Token requestToken, Verifier verifier) {
                OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
                switch (api.getAccessTokenVerb()) {
                    case POST:
                        request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
                        // API Secret is optional
                        if (config.getApiSecret() != null && config.getApiSecret().length() > 0)
                            request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
                        if (requestToken == null) {
                            request.addBodyParameter(OAuthConstants.CODE, verifier.getValue());
                            request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
                            request.addBodyParameter(OAuthConstants.GRANT_TYPE, OAuthConstants.GRANT_TYPE_AUTHORIZATION_CODE);
                        } else {
                            request.addBodyParameter(OAuthConstants.REFRESH_TOKEN, requestToken.getSecret());
                            request.addBodyParameter(OAuthConstants.GRANT_TYPE, OAuthConstants.GRANT_TYPE_REFRESH_TOKEN);
                        }
                        break;
                    case GET:
                    default:
                        request.addQuerystringParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
                        // API Secret is optional
                        if (config.getApiSecret() != null && config.getApiSecret().length() > 0)
                            request.addQuerystringParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
                        request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue());
                        request.addQuerystringParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
                        if(config.hasScope()) request.addQuerystringParameter(OAuthConstants.SCOPE, config.getScope());
                }
                Response response = request.send();
                return api.getAccessTokenExtractor().extract(response.getBody());
            }
        }
    
    }
    

    你找到这个问题的解决方案了吗?保利乌斯·马图利奥尼斯,我不知道弗兰克是否找到了答案,但这是可能的:请看我的地下创举。您是在scribe上发出拉取请求还是在某处发布了您的实现?如果已经有人制造了轮子,就不需要再发明了!lluft,基本上,我编造了你的评论,几个小时后找到了一个答案,请看我上面的答案Scribe Java Supports 2.0 now