def subscribe( self ): device_token = self.request.get( 'device_token', None ); type = self.request.get( 'type', None ); # ios or android # パラメータが足りなかったらエラー if device_token is None or type is None: functions.printError( "parameter missing" ) return # ios の場合は urbanairship に登録する。 # android の場合はクライアント側のライブラリが # urbanairship への登録までやってくれているので何もしない。 if type == "ios": from openfish.libs import urbanairship import config airship = urbanairship.Airship( config.URBANAIRSHIP_APP_KEY, config.URBANAIRSHIP_MASTER_SECRET )# 2つ目は master secret airship.register( device_token, alias=self.user.ua_alias ) # user のプロパティとして保存 self.user.device_token = device_token self.user.put() logging.info( "%s の device_token を %s として登録しました" % ( str(self.user.key), str(device_token) ) ) # 出力 out = { "meta": functions.createMetaData( status="ok", code=200, method_name="subscribePushNotification" ), }; self.response.out.write( json.encode(out) )
def externalAccountLogin( self ): logging.info( self.request.arguments() ) token = self.request.get( "token", None ) tokenSecret = self.request.get( "tokenSecret", None ) type = self.request.get( "type" ) if token is None: functions.printError( "users externalAccountLogin パラメータが足りません" ) return; if type=="facebook": self._externalAccountLoginWithFacebook( token ) elif type=="twitter": self._externalAccountLoginWithTwitter( token, tokenSecret )
def externalAccountLink( self ): if self.user is None: functions.printError( "users externalAccountLink ログインが必要です" ) return; type = self.request.get( "type" ) token = self.request.get( "token", None ) ea = models.ExternalAccount() ea.token = token ea.external_type = type # facebook情報を取得 url = 'https://graph.facebook.com/me?access_token='+ token +'&fields=name,picture,email&locale=ja_JP' result = urlfetch.fetch(url) if result.status_code != 200: functions.printError( "tokenが不正です。"+ result.content ) return result_obj = json.decode( result.content ) facebook_id = str( result_obj["id"] ) auth_id = "facebook:"+ facebook_id ea.external_id = facebook_id self.user.external_accounts = ea; if "email" in result_obj: self.user.email = result_obj["email"] self.user.add_auth_id( auth_id ) out = { "meta": functions.createMetaData( status="ok", code=200, method_name="externalAccountLink" ), "response":{ "users": [ self.user.toDict( full=True ), ], }, }; self.response.out.write( json.encode(out) )
def extendSSOAccessToken( self ): if self.user is None: functions.printError( "ログインが必要です" ) return; if self.user.external_accounts is None: functions.printError( "facebook認証が必要です" ) return; url = "https://api.facebook.com/method/auth.extendSSOAccessToken?format=json&access_token="+ self.user.external_accounts.token result = urlfetch.fetch(url) if result.status_code != 200: functions.printError( "facebook extendSSOAccessToken tokenが不正です。"+ result.content ) return result_obj = json.decode( result.content ) if "access_token" in result_obj == False: logging.error( "facebook extendSSOAccessToken facebook の accessToken を延長できませんでした。"+ result.content ) out = { "meta": functions.createMetaData( status="fail", code=200, method_name="extendSSOAccessToken" ), }; self.response.out.write( json.encode(out) ) return self.user.external_accounts.token = result_obj["access_token"] self.user.put() logging.debug( "facebook extendSSOAccessToken accessToken を正常に延長できました。" ) out = { "meta": functions.createMetaData( status="ok", code=200, method_name="extendSSOAccessToken" ), "response":{ "accessToken": self.user.external_accounts.token, }, }; self.response.out.write( json.encode(out) )
def _externalAccountLoginWithFacebook( self, token ): ea = models.ExternalAccount() ea.token = token ea.external_type = "facebook" # facebook情報を取得 url = 'https://graph.facebook.com/me?access_token='+ token +'&fields=name,picture,email&locale=ja_JP' result = urlfetch.fetch(url) if result.status_code != 200: functions.printError( u"tokenが不正です。["+ token +u"]"+ result.content ) return result_obj = json.decode( result.content ) facebook_id = str( result_obj["id"] ) auth_id = "facebook:"+ facebook_id ea.external_id = facebook_id # logging.info( auth_id ) # 存在チェック user = self.user_model.get_by_auth_id( auth_id ) # logging.info( user ) if user: if "email" in result_obj and user.email != result_obj["email"]: user.email = result_obj["email"] user.external_accounts = ea user.put() logging.info( "すでに登録済みなのでログインします" ) else: logging.info( "初めてのユーザーなので User 作成してログイン処理します!" ) # まずプロフィール写真取得して保存 photoUrl = "https://graph.facebook.com/"+ facebook_id +"/picture?type=large" photoResult = urlfetch.fetch( photoUrl ) photo = models.Photo() photo.save( photoResult.content ) result_tuple = self.user_model.create_user( auth_id ) # User 作成 logging.info( result_tuple ) user = result_tuple[1] user.external_accounts = ea user.name = result_obj["name"] user.nickname = result_obj["name"] if "email" in result_obj: user.email = result_obj["email"] user.photo_key = photo.key user.put() # ログイン処理 sessionId = self.serialize_user_token( user ) out = { "meta": { "status": "ok", "code": 200, "method_name":"externalAccountLogin", "session_id": sessionId, }, "response":{ "users": [ user.toDict( full=True ), ], }, }; self.response.out.write( json.encode(out) )
def update( self ): # logging.info( self.request.arguments() ); nickname = self.request.get( "nickname", None ) photo_id = self.request.get( "photo_id", None ) email = self.request.get( "email", None ) password = self.request.get( "password", None ) if self.user is None: out = { "meta": functions.createMetaData( status="fail", code=401, method_name="updateUser", message="ログインが必要です" ), }; self.response.out.write( json.encode(out) ) return if nickname: self.user.nickname = nickname if photo_id: photo = models.Photo.get_by_id( int(photo_id) ) if photo is None: functions.printError( "Photo#%d が見つかりません"%(int(photo_id)) ) return; if photo.user_key != self.user.key: functions.printError( "あなたのアップロードした Photo ではありません" ) return; self.user.photo_key = photo.key; # ログイン情報更新する場合 if email and password: logging.info( "ログイン情報をupdateします" ) auth_id = "own:"+ email # すでに他の人にメールアドレスが使われているかチェック existingUser = models.User.get_by_auth_id( auth_id ) if existingUser: logging.info( "すでに%sを使っているので、それが自分自身かどうか調べます。" % ( str(auth_id) ) ) logging.info( existingUser.key.id() ) logging.info( self.user.key.id() ) if existingUser.key.id() != self.user.key.id(): logging.info( "他の人によって使われていました。" ) functions.printError( "users update メアドが使われています" ) return; # すでに 自分の own:username が登録されているかチェック ownId = -1 for k, v in enumerate( self.user.auth_ids ): if v[0:4] == "own:": ownId = k break; # 存在していたら更新、存在していなかったら追加 if ownId == -1: self.user.add_auth_id( auth_id ) else: self.user.auth_ids[k] = auth_id self.user.password = security.generate_password_hash( password, length=12 ) self.user.put() out = { "meta": functions.createMetaData( status="ok", code=200, method_name="updateUser" ), "response":{ "users": [ self.user.toDict( full=True, viewerUser=self.user ), ], }, }; self.response.out.write( json.encode(out) )