我在cloud.google.com注册了一个网络应用程序。“OAuth 2.0客户端ID”如下所示:

我正在使用grails和grails插件。在Config.groovy中,我添加了折叠片段:
google {
api = GoogleApi
key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com'
secret = 'yyyyyyyyyyyyyyyyyyyyyyyy'
scope = 'https://www.googleapis.com/auth/userinfo.profile'
callback = "http://localhost:8080/grailsOauthPluginDemo/oauth/google/callback"
successUri = "http://localhost:8080/grailsOauthPluginDemo/oauthCallBack/google"
failureUri = "http://localhost:8080/grailsOauthPluginDemo/oauthCallBack/failure"
}和下面的内容进入index.gsp
<oauth:connect provider="google">Google</oauth:connect><br/>我是登录我的个人谷歌帐户。我使用的是https://github.com/manishkbharti/grailsOauthPluginDemo,当单击Google链接时,我得到了同意页面,如下所示:

我本来希望有一个页面看起来像下面这样的我的应用程序名称。我知道我必须添加一个图片,但应用程序名称应该弹出。

发布于 2013-12-09 05:48:06
我相信grailsOauthPluginDemo使用的是Google的OAuth1.0aAPI,目前同意页面使用不同的模板。
希望这能帮上忙!
发布于 2014-05-13 18:26:12
谢谢@svaret尝试这个应用程序。
我已经更新了应用程序,现在它正在使用oauth2 for Google authentication。
试一试。
解决方案:-
在src/java中创建一个文件,例如Google2Api.java并粘贴以下代码(Ref# https://gist.github.com/yincrash/2465453)
package yourPackate;
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 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";
@Override
public String getAccessTokenEndpoint() {
return "https://accounts.google.com/o/oauth2/token";
}
@Override
public AccessTokenExtractor getAccessTokenExtractor() {
return new AccessTokenExtractor() {
@Override
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));
return new Token(token, "", response);
}
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()) {
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(),
OAuthEncoder.encode(config.getCallback()),
OAuthEncoder.encode(config.getScope()));
} else {
return String.format(AUTHORIZE_URL, 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 class GoogleOAuth2Service extends OAuth20ServiceImpl {
private static final String GRANT_TYPE_AUTHORIZATION_CODE = "authorization_code";
private static final String GRANT_TYPE = "grant_type";
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());
request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
request.addBodyParameter(OAuthConstants.CODE, verifier.getValue());
request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
request.addBodyParameter(GRANT_TYPE, GRANT_TYPE_AUTHORIZATION_CODE);
break;
case GET:
default:
request.addQuerystringParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
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());
}
}
}并在google provider中更新Config.groovy
....
google {
api = yourPackate.Google2Api
...
}
....注意:-包名不能与org.scribe.builder.api相同。做一些不同的包名。我正在使用org.scribe.api。
发布于 2014-05-28 14:27:26
https://github.com/manishkbharti/grailsOauthPluginDemo已经更新了谷歌使用Oauth2的方式。如果您不能从这个演示中使用Oauth2,您可以查看grails插件:插件(https://github.com/donbeave/grails-spring-security-oauth-google)。在源代码中,他们试图实现Oauth2 from DefaultApi20 class。
我不知道为什么,但是我只能在进程之后获得授权代码,所以我需要做一个额外的步骤来将此代码转换为访问令牌,下面是详细的代码:
def oauth2callback ={ def code = params.code
HttpTransport transport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
String CLIENT_ID = "....";
String CLIENT_SECRET = "....";
String REDIRECT_URI = ".....";
GoogleTokenResponse response =
new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, code, REDIRECT_URI).execute();
GoogleCredential credential = new GoogleCredential.Builder().setClientSecrets(CLIENT_ID, CLIENT_SECRET)
.setJsonFactory(jsonFactory).setTransport(transport).build()
.setAccessToken(response.getAccessToken()).setRefreshToken(response.getRefreshToken());
SpreadsheetService service = new SpreadsheetService("MySpreadsheetIntegration-v1");
service.setOAuth2Credentials(credential);
// Define the URL to request. This should never change.
URL SPREADSHEET_FEED_URL = new URL(
"https://spreadsheets.google.com/feeds/spreadsheets/private/full");
// Make a request to the API and get all spreadsheets.
SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
List<SpreadsheetEntry> spreadsheets = feed.getEntries();
spreadsheets.each {
println it.getTitle().getPlainText()
}
}https://stackoverflow.com/questions/20455626
复制相似问题