Android端如何为Google Chat API请求添加授权头?
解决Google Chat API调用401未认证错误
核心问题
你的请求未携带OAuth 2.0 Access Token,Google Chat API要求必须在请求头中添加Authorization: Bearer {access_token},这是返回401错误的直接原因。
修复步骤及代码示例
1. 直接在Retrofit接口中添加认证头
修改你的createSpace方法,新增@Header参数用于传递认证信息:
@FormUrlEncoded @POST("spaces") Call<Space> createSpace( @Header("Authorization") String authHeader, @Field("name") String name, @Field("spaceType") SpaceType spaceType, @Field("threaded") Boolean threaded, @Field("singleUserBotDm") Boolean singleUserBotDm, @Field("spaceDetails") SpaceDetails spaceDetails );
调用接口时,将Google Sign-In获取到的token格式化为Bearer {token}传入:
// 从已登录的Google账号中获取token String accessToken = GoogleSignIn.getLastSignedInAccount(context).getIdToken(); // 发起请求 Call<Space> call = chatService.createSpace("Bearer " + accessToken, "Space name", SpaceType.DIRECT_MESSAGE, false, true, spaceDetails);
2. 更优雅的统一处理:使用OkHttp拦截器
如果多个接口都需要认证,建议用拦截器自动给所有请求添加认证头,避免重复编写代码:
// 构建带拦截器的OkHttpClient OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(chain -> { Request originalRequest = chain.request(); // 获取当前登录用户的Access Token String accessToken = GoogleSignIn.getLastSignedInAccount(context).getIdToken(); // 给请求添加认证头 Request authorizedRequest = originalRequest.newBuilder() .header("Authorization", "Bearer " + accessToken) .build(); return chain.proceed(authorizedRequest); }) .build(); // 初始化Retrofit时使用这个client Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://chat.googleapis.com/v1/") .client(client) .addConverterFactory(GsonConverterFactory.create()) .build();
这种方式下,你的Retrofit接口无需修改,保持原有定义即可。
3. 确认Sign-In的权限范围
确保Google Sign-In初始化时,请求了Google Chat API所需的权限(scope),比如创建空间需要https://www.googleapis.com/auth/chat.create:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestScopes(new Scope("https://www.googleapis.com/auth/chat.create")) .build();
4. 额外优化:改用JSON请求体
Google Chat API更推荐使用JSON格式传递请求参数,能避免spaceDetails对象序列化异常的问题。你可以重构接口为:
// 定义请求实体类 public class CreateSpaceRequest { private String name; private SpaceType spaceType; private Boolean threaded; private Boolean singleUserBotDm; private SpaceDetails spaceDetails; // 构造方法、getter/setter省略 } // 修改Retrofit接口 @POST("spaces") Call<Space> createSpace(@Body CreateSpaceRequest request);
内容的提问来源于stack exchange,提问作者Naufal Rajabi
相关产品推荐
相关产品推荐

