使用后端服务器Java

时间:2017-02-27 18:18:26

标签: java google-app-engine jwt google-authentication google-client

我有一个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令牌的完整性。

0 个答案:

没有答案