첫 번째 앱 엔진 앱을 만들고 있으며 사용자 인증에 문제가 있습니다.
나는 https://cloud.google.com/appengine/docs/python/endpoints/consume_android#making_authenticated_calls를 따랐습니다 -약간 마법처럼 보이지만 "setAccountName"만 있고 작동해야하지만, w / e, Android Audience에서 앱 범위를로드해야한다고 추측 한 다음 전달한 계정 이름이 실제로 기기에 로그인했는지 확인합니다.
API 호출이 작동하고 인증을 통과하지만 슬프게도 백엔드의 "endpoints.get_current_user ()"함수는 None을 반환합니다.
그래서 계속 파고 있었지만 주제에 대해 아무것도 찾을 수없는 것 같습니다. 내가 찾은 가장 좋은 점은 http://blog.notdot.net/2010/05/Authenticating-against-App-Engine-from-an-Android-app입니다 .하지만 이것은 6 년 전의 기사이며 저자는 HTTP 클라이언트를 사용합니다. 끝점 libs와 관련이 없습니다.
내가 생각할 수있는 것은 내 앱에 "Google로 로그인"을 추가하는 "비 엔드 포인트"방식을 따른 다음 내 API 빌더에 가져올 자격 증명을 전달하는 것입니다.하지만 그게 잘못된 것 같습니다. 그렇게하는 더 쉬운 방법이 될 것입니다.
따라서 https://cloud.google.com/appengine/docs/python/endpoints/consume_android#making_authenticated_calls 에서 언급되지 않은 몇 가지 단계가 누락 되었습니까?
아래의 실제 코드 (약간 단순화 됨) :
백엔드 :
auth_api = endpoints.api(
name='auth_api',
version='v1.0',
auth_level=endpoints.AUTH_LEVEL.REQUIRED,
allowed_client_ids=[
ANDROID_CLIENT_ID,
WEB_CLIENT_ID,
endpoints.API_EXPLORER_CLIENT_ID,
],
audiences=[
WEB_CLIENT_ID,
endpoints.API_EXPLORER_CLIENT_ID,
],
scopes=[
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/userinfo.email',
],
)
@auth_api.api_class(resource_name='rating')
class RatingHandler(remote.Service):
@endpoints.method(
message_types.VoidMessage,
RatingsMessage,
path='rating/getRatings',
http_method='GET',
)
def getRatings(self, request):
rating_query = Rating.query(
ancestor=ndb.Key(
Account,
endpoints.get_current_user().user_id(), // ERROR! endpoints.get_current_user() is None
)
).order(-Rating.rating)
고객:
// Somewhere these lines exist
if (credential == null || credential.getSelectedAccountName() == null) {
startActivityForResult(
AuthUtils.getCredentials(getActivity()).newChooseAccountIntent(),
AuthUtils.REQUEST_ACCOUNT_PICKER
);
} else {
LoadRatings();
}
@Override
public void onActivityResult(
int requestCode,
int resultCode,
Intent data
) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null && data.getExtras() != null) {
String accountName =
data.getExtras().getString(
AccountManager.KEY_ACCOUNT_NAME
);
if (accountName != null) {
credential = GoogleAccountCredential.usingAudience(
getApplicationContext(),
"server:client_id:" + Constants.ANDROID_AUDIENCE
);
credential.setSelectedAccountName(accountName);
LoadRatings();
}
}
}
public void LoadRatings() {
// AuthApi was auto-generated by Google App Engine based on my Backend
AuthApi.Builder api = new AuthApi.Builder(
AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(),
credential
).setApplicationName(getPackageName());
AuthApi service = api.build();
try {
ApiMessagesRatingRatedBeerListMessage result = service.rating().getRatings().
// some stuff done with result, but the Exception is thrown in line above
좋아, 알아 냈어. API 선언에서 "범위"를 제거하면 작동합니다. 아직 사용자의 이메일 / 프로필에 액세스하는 방법을 잘 모르겠지만 적어도 한 단계 더 발전한 것입니다.
이 문제는 실제로 이전에 제기되었습니다 -GoogleCloud Endpoints에서 범위를 추가하는 방법 -슬프게도 답변이 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다