我有一个Android应用程序,登录时会生成idtoken
GoogleSignInAccount acct = result.getSignInAccount();
String idToken = acct.getIdToken();
以上ID令牌是json web令牌,应该从应用程序服务器验证。我有使用Springs的appengine后端应用程序。所以我想在后端的每个restful webservice中验证此令牌。
根据谷歌文档
https://developers.google.com/identity/sign-in/android/backend-auth
有三种方法
1)使用自定义方法,例如使用JWT。在那种情况下,我无法确定要使用的密钥。使用https://jwt.io/。我粘贴了我的jwt令牌,这是无效的签名。
2)使用谷歌提供的Java客户端库 我几乎使用谷歌提供的相同标准代码。我参考了以下链接
https://android-developers.googleblog.com/2016/01/using-google-sign-in-with-your-server.html
https://raw.githubusercontent.com/lmoroney/serverauth/master/LmauthtestServlet.java
我的Java代码是这样的 public class AuthenticateUtil {
private final GoogleIdTokenVerifier mVerifier;
public AuthenticateUtil() {
NetHttpTransport transport = new NetHttpTransport();
GsonFactory jsonFactory = new GsonFactory();
mVerifier = new GoogleIdTokenVerifier.Builder(transport,jsonFactory)
// Here is where the audience is set -- checking that it really is your server
// based on your Server’s Client ID
.setAudience(Arrays.asList("**My client ID"))
// Here is where we verify that Google issued the token
.setIssuer("https://accounts.google.com").build();
}
public void verify(String idTokenString){
System.out.println("idTokenString>>"+idTokenString);
try {
GoogleIdToken idToken = mVerifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload();
System.out.println(payload.getSubject());
} else {
System.out.println("Invalid ID token.");
}
} catch (GeneralSecurityException | IOException e) {
// TODO Auto-generated catch block
System.out.println("Inside exception");
e.printStackTrace();
}
}
上面的代码是异常
java.lang.IllegalArgumentException
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111)
at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37)
at com.google.api.client.json.webtoken.JsonWebSignature$Parser.parse(JsonWebSignature.java:602)
at com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.parse(GoogleIdToken.java:57)
at com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier.verify(GoogleIdTokenVerifier.java:191)
at com.AuthenticateUtil.verify(AuthenticateUtil.java:48)
3)使用以下google Token端点进行验证
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token= {令牌}
不应该使用它,因为它需要来自服务器的HTTP请求并增加客户端的延迟。
我想要一个解决方案如何验证java客户端在后端服务器上生成的jwt令牌的完整性。